概述

在C语言中,main()是程序最早开端建议和初始化的当地。 在Objective-C中,application,documents,user inter安全教育渠道face都有自己初始化的当地,所以,在main()中仅仅简略的调用 NSApplicationMain。

Ob安全教育渠道登录进口jective-C中第一个初始化的当地是 +(void)load. 任何class都能有一个+(void)load。

+load

+load办法在类被加载到系统时调用,这发生在一个很早的时刻, +load的办法的调用次第为:

  • 链接到的结构初始化(包括+load)
  • 当时镜像(image)的+load
  • 当时镜像的C++静态初始化和C/C++ attribute(constructapproveor)结构函数
  • objective c语法接到你的结构初始化。

下面安全教育渠道登录进口能够看到load被加载的机会:

Objective-C runtime之load和initialize

+load办法调用的时分没有有自动开枸杞释池,所以假定+load中的内容运用到了自动开释池,则代码需要用@autoreleasepool{}包括。 另外,对应Category中的+load办法并不会掩盖类本身中的+load办法,两个+load办法都会调用,而且Category的+load办法在类本身的+load办法之后调用。
代码比方:

@interface LoadClass : NSObject
@end
@implementation LoadClass
+ (void)load
{
NSLog(@"####loading");
}
__attribute__((constructor)) static void ConstructorLoad(void)
{
NSLog(@"ConstructorLoad ");
}
@end
@implementatiGoon LoadC宫颈癌前期症状lass (LoadClass_category)
+objective c语法 (void)load
{
NSLog(@"####LoadClass_categoryappreciate loading ");
}
@end
int main(int argc, char *argv[])
{
@autoreleasepool {
@autoreleasepool {
NSLog(@"main Start");
}google
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegateclass]));
}
}

输出

#### loading
#### LoadClass_category loading
ConstructorLoad
main Start

+initialize

+initialize安全办法在一个比较安全的环境中调用,比+load更加适宜放入初始化代码。

+initialize办法在类初次收到音讯时调用,若此类一向没有运用,则+initialiobjective caseze就不会调用。 与+load办法objective c基础教程相似的,在向子类发送initialize音讯前,总是会先向父类发送initialize音讯,假定父类没有调用+initialize办规则调用
Category中的+initialize办法会掩盖类本身的+initialize办法。假定父类中完成了+initialize办法,而子类中没有重写此办法,则子类初始化安全手抄报时就会运用父类的办法。
代码:


@intgoogleerface AbstractBase : NSObject
@end
@implementat安全ion AbstractBase
+ (void)initialize
{
NSLog(@"%@ initialize in ",self);
}
@end
@interface SubClasss : AbstractBase
@end
@implementation SubClasss
+ (void)init安全手抄报ialize
{
NSLog(@"%@ inios8备忘录itialize in ",self);
}
@end
int main()
{
@autoreleasepool {
NSLog(@"main Start");
[SubClasss class];
NSLog(@appointment"main End");
}
return0;
}

其输出为:

main Start
AbstractBase initialize
SubClasss initialize
main End

假定不想子类运用父类的+iappointmentnitializeappstore办法,则父类的+initialize办法能够这样写。经测验该做法无效

+ (void)initialize
{
if(self == [ParentClass class])
{
... iobjective clause什么意思nit..
}
}

参考资料

  • Objective-C +load vs +initializ安全教育渠道e
  • Theios8备忘录 App Launch Sequobjective clauses是什么意思ence on iOS
  • +initialize Can Be Executed Multiple Times (+load not so much)
  • Objective-C类初始化:load与initialize
  • Friday Q&a安全教育渠道mp;A 2009-05-22: Objective-C Class Loading and Initialization

总结安全期是哪几天

load方appear法的调用机会:ios最好玩的手游

–> 链接到结构初始化(结构的load办法ioslauncher)

–> 当时image的load办法

-&安全期计算器gt; Category的load办法

–> C/C++结构函数__attribute__((constructoiOSr)) static void self_define安全教育渠道_method_name(void)

initiobjective casealize办法的调用机会

–> + (void) initialize办法,假定该类或许其子类(安全出产月多级子类)没有接受音讯的话,+ (void) initiaobjective-c和c区别lize办法是不会被履行的,假定调用了子类(多级子类),则父类的+ (void) initi安全出产法alize办法也会被履行

__attribute__关键词

–> attribute((constructor)) // 在main函数被调用之前调用
–> attribute((destructor))ios最好玩的手游 // 在main函数被调用之后调