日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Objetive-C +load方法研究

發布時間:2023/11/27 生活经验 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Objetive-C +load方法研究 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • load方法的執行時機
Objetive-C?的runtime會在一個類的所有方法加載到內存中時調用這個類的+load() 方法,因為每個類的方法只是加載一次,所以每個+load()方法只調用一次。 加載一個類的方法會在一個進程啟動開始的時候,這個時候進程的業務代碼沒有還沒有開始執行。 對于動態庫中的類,類的+load方法會在動態庫加載進進程的內存空間時的時候執行
  • load的執行次序
+load的方法會從父類到子類的順序執行,對于一個類的擴展中的Load方法,執行順序是不確定的。 +load的方法不遵從其它繼承方法執行的規律,只有一個類或者擴展存在load方法的時候才會執行。原因是load的方法的imp查找是直接通過特殊的方法查找的,見 http://opensource.apple.com/source/objc4/objc4-532.2/runtime/objc-runtime-new.mm
/***********************************************************************
* _class_getLoadMethod
* fixme
* Called only from add_class_to_loadable_list.
* Locking: runtimeLock must be read- or write-locked by the caller.
**********************************************************************/
IMP 
_class_getLoadMethod(Class cls_gen)
{rwlock_assert_locked(&runtimeLock);class_t *cls = newcls(cls_gen);const method_list_t *mlist;uint32_t i;assert(isRealized(cls));assert(isRealized(cls->isa));assert(!isMetaClass(cls));assert(isMetaClass(cls->isa));mlist = cls->isa->data()->ro->baseMethods;if (mlist) for (i = 0; i < mlist->count; i++) {method_t *m = method_list_nth(mlist, i);if (0 == strcmp((const char *)m->name, "load")) {return m->imp;}}return NULL;
}
下面是一個Demo
@interface initTest : NSObject @end @interface sub1 : initTest @end @interface sub2 : sub1 @end @interface sub2 (category1) @end
@interface sub2 (category2) @end //實現 @implementation initTest

//+(void)initialize
//{
//??? NSLog(@"%s|%@? ",__func__ ,[self class]);
//}

+(void)load
{
??? NSLog(@"%s? ",__func__ );
}

@end


@implementation sub1

//+(void)initialize
//{
//??? NSLog(@"%s|%@? ",__func__ ,[self class]);
//}

//+(void)load
//{
//??? NSLog(@"%s? ",__func__ );
//}
@end


@implementation sub2

//+(void)initialize
//{
//??? NSLog(@"%s|%@? ",__func__ ,[self class]);
//}

+(void)load
{
??? NSLog(@"%s? ",__func__ );
}

@end


@implementation sub2 (category1)

+(void)load
{
??? NSLog(@"%s? ",__func__ );
}

@end

@implementation sub2 (category2)

+(void)load
{
??? NSLog(@"%s? ",__func__ );
}
@end
執行結果如下:
2015-05-26 13:09:37.955 OCinitTest[79585:72506319] +[initTest load]?
2015-05-26 13:09:37.956 OCinitTest[79585:72506319] +[sub2 load]?
2015-05-26 13:09:37.956 OCinitTest[79585:72506319] +[sub2(category1) load]?
2015-05-26 13:09:37.956 OCinitTest[79585:72506319] +[sub2(category2) load] ?
  • load方法可以用來做什么
對于一個方法的Swizzle,因為這個時候改變runtime中得方法比執行中改變更安全

轉載于:https://www.cnblogs.com/doudouyoutang/p/4530403.html

總結

以上是生活随笔為你收集整理的Objetive-C +load方法研究的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。