IOS开发+(void)load与+(void)initialize区别
2015-09-15 15:49
549 查看
在IOS开发中,就像Application有生命周期回调方法一样,在Objective-C的类被加载和初始化的时候,也可以收到方法回调,可以在适当的情况下做一些定制处理。而这正是本篇文章所要介绍的load和initialize方法可以帮我们做到的。
load和initialize的共同特点
load和initialize有很多共同特点,下面简单列一下:
在不考虑开发者主动使用的情况下系统最多会调用一次
如果父类和子类都被调用,父类的调用一定在子类之前
都是为了应用运行提前创建合适的运行环境
在使用时都不要过重地依赖于这两个方法,除非真正必要
+load方法
调用时机比较早,运行环境有不确定因素。具体说来,通常都是App启动前进行调用,当load调用的时候,并不能保证所有类都加载完成且可用,必要时还要自己负责做auto release处理.
对于一个类,如果没有实现load方法就不会调用,不会考虑对NSObject的继承.
父类的load方法会优先于子类调用,类别的load方法一般最后调用不会直接触发initialize的调用。
通俗的讲就是: 在程序启动之前会调用所有的类的(手动实现的)+load方法(没有实现就不调用咯),按(父类->子类->类别)的顺序调用.
+initialize方法
initialize的自然调用是在第一次主动使用当前类的时候 (第一次 alloc 时)
在initialize方法收到调用时,运行环境基本健全。
initialize的运行过程中是能保证线程安全的。
和load不同,即使子类不实现initialize方法,会把父类的实现继承过来调用一遍。注意的是在此之前,父类的方法已经被执行过一次了,同样不需要super调用。
通俗的讲就是:在程序启动之后,在第一次创建这个类的对象的时候(也就是分配内存空间alloc的时候),会调用该类的+initialize方法且只调用一次.
[调用顺序 1.如果父类的initialize方法没有被调用过会先调用父类的initialize方法) 2.如果该类有类别只会调用类别的+initialize(如果有多个类别会调用某一个类别的initialize方法,其他的不会调用)]
由于initialize的这些特点,使得其应用比load要略微广泛一些。可用来做一些初始化工作,或者单例模式的一种实现方案。
Apple的文档很清楚地说明了initialize和load的区别在于:load是只要类所在文件被引用就会被调用,而initialize是在类或者其子类的第一个方法被调用前调用。所以如果类没有被引用进项目,就不会有load调用;但即使类文件被引用进来,但是没有使用,那么initialize也不会被调用。
上代码:
如上 所有的+load方法会在 NSLog(@”appdelegate”) 之前被调用.
如图:
+(void)load方法的调用顺序:Father > Son > Daughter > GrandSon > Father+Cry > Son+Eat > Father+Laugh
而+initialize方法基本上都是在 NSLog(@”appdelegate”) 之后被调用.
如下
会触发父类 (如果父类没有被alloc过)的initialize方法,由于类别(Category)中的initialize方法会覆盖之前类别和类中的initialize方法,所以只会调用两个initialize方法 即 Father+LaughInitialize > Son+EatInitialize .
load和initialize的共同特点
load和initialize有很多共同特点,下面简单列一下:
在不考虑开发者主动使用的情况下系统最多会调用一次
如果父类和子类都被调用,父类的调用一定在子类之前
都是为了应用运行提前创建合适的运行环境
在使用时都不要过重地依赖于这两个方法,除非真正必要
+load方法
调用时机比较早,运行环境有不确定因素。具体说来,通常都是App启动前进行调用,当load调用的时候,并不能保证所有类都加载完成且可用,必要时还要自己负责做auto release处理.
对于一个类,如果没有实现load方法就不会调用,不会考虑对NSObject的继承.
父类的load方法会优先于子类调用,类别的load方法一般最后调用不会直接触发initialize的调用。
通俗的讲就是: 在程序启动之前会调用所有的类的(手动实现的)+load方法(没有实现就不调用咯),按(父类->子类->类别)的顺序调用.
+initialize方法
initialize的自然调用是在第一次主动使用当前类的时候 (第一次 alloc 时)
在initialize方法收到调用时,运行环境基本健全。
initialize的运行过程中是能保证线程安全的。
和load不同,即使子类不实现initialize方法,会把父类的实现继承过来调用一遍。注意的是在此之前,父类的方法已经被执行过一次了,同样不需要super调用。
通俗的讲就是:在程序启动之后,在第一次创建这个类的对象的时候(也就是分配内存空间alloc的时候),会调用该类的+initialize方法且只调用一次.
[调用顺序 1.如果父类的initialize方法没有被调用过会先调用父类的initialize方法) 2.如果该类有类别只会调用类别的+initialize(如果有多个类别会调用某一个类别的initialize方法,其他的不会调用)]
由于initialize的这些特点,使得其应用比load要略微广泛一些。可用来做一些初始化工作,或者单例模式的一种实现方案。
Apple的文档很清楚地说明了initialize和load的区别在于:load是只要类所在文件被引用就会被调用,而initialize是在类或者其子类的第一个方法被调用前调用。所以如果类没有被引用进项目,就不会有load调用;但即使类文件被引用进来,但是没有使用,那么initialize也不会被调用。
上代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. NSLog(@"appdelegate"); self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.window.backgroundColor = [UIColor blackColor]; ViewController *vc = [[ViewController alloc] init]; UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc]; self.window.rootViewController = nav; [self.window makeKeyAndVisible]; return YES; }
如上 所有的+load方法会在 NSLog(@”appdelegate”) 之前被调用.
如图:
+(void)load方法的调用顺序:Father > Son > Daughter > GrandSon > Father+Cry > Son+Eat > Father+Laugh
而+initialize方法基本上都是在 NSLog(@”appdelegate”) 之后被调用.
如下
[Son alloc];
会触发父类 (如果父类没有被alloc过)的initialize方法,由于类别(Category)中的initialize方法会覆盖之前类别和类中的initialize方法,所以只会调用两个initialize方法 即 Father+LaughInitialize > Son+EatInitialize .
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- mysql load data 导出、导入 csv
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- Ruby中require、load、include、extend的区别介绍
- mysql LOAD语句批量录入数据
- jquery中load方法的用法及注意事项说明
- jQuery load方法用法集锦
- jquery通过load获取文件的内容并跳到锚点的方法
- jQuery的load()方法及其回调函数用法实例
- jquery中页面Ajax方法$.load的功能使用介绍
- jQuery使用load()方法载入另外一个网页文件内的指定标签内容到div标签的方法
- 用Jquery.load载入页面后样式没了页面混乱的解决方法
- mysql 的load data infile
- Lazy Load 延迟加载图片的jQuery插件中文使用文档
- 如何让浏览器支持jquery ajax load 前进、后退功能