首页 > Objetive-C +load方法研究

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

更多相关:

  • 来源:公众号|计算机视觉工坊(系投稿)作者:仲夏夜之星「3D视觉工坊」技术交流群已经成立,目前大约有12000人,方向主要涉及3D视觉、CV&深度学习、SLAM、三维重建、点云后处理、自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、...

  • 点云PCL免费知识星球,点云论文速读。文章:Real-Time LIDAR-Based Urban Road and Sidewalk Detection for Autonomous Vehicles作者:Ern˝o Horváth  , Claudiu Pozna ,and Miklós Unger编译:点云PCL代码:http...

  • 文章:Semantic Histogram Based Graph Matching for Real-Time Multi-Robot Global Localization in Large Scale Environment作者:Xiyue Guo, Junjie Hu, Junfeng Chen, Fuqin Deng, T...

  • 点云PCL免费知识星球,点云论文速读。文章:Robust Place Recognition using an Imaging Lidar作者:Tixiao Shan, Brendan Englot, Fabio Duarte, Carlo Ratti, and Daniela Rus编译:点云PCL(ICRA 2021)开源代码:...

  • 文章:A Survey of Calibration Methods for Optical See-Through Head-Mounted Displays作者:Jens Grubert , Yuta Itoh, Kenneth Moser编译:点云PCL本文仅做学术分享,如有侵权,请联系删除。欢迎各位加入免费知识星球,获取PD...