美文网首页
Objective-C类初始化:load与initialize

Objective-C类初始化:load与initialize

作者: 半岛夏天 | 来源:发表于2018-06-26 14:29 被阅读2次

    原文链接:http://wufawei.com/2013/06/load-initialize/

    在C语言中,main()是程序最早开始启动和初始化的地方。 在Objective-C中,application,documents,user interface都有自己初始化的地方,所以,在main()中只是简单的调用 NSApplicationMain。  

    Objective-C中第一个初始化的地方是 +(void)load. 任何class都能有一个+(void)load。

    1 +load

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

    链接到的框架初始化(包括+load)

    当前镜像(image)的+load

    当前镜像的C++静态初始化和C/C++ attribute(constructor)构造函数

    链接到你的框架初始化。

    下面可以看到load被加载的时机:

    +load方法调用的时候尚未有自动释放池所以如果+load中的内容使用到了自动释放池,则代码需要用@autoreleasepool{}包含。 另外,对应Category中的+load方法并不会覆盖类自身中的+load方法两个+load方法都会调用,而且Category的+load方法在类自身的+load方法之后调用。

    代码例子:

    ```

    @implementation LoadClass

    + (void)load

    {

        NSLog(@"####loading");

    }

    __attribute__((constructor)) staticvoid ConstructorLoad(void)

    {

        NSLog(@"ConstructorLoad ");

    }

    @end

    @implementation LoadClass (LoadClass_category)

    + (void)load

    {

        NSLog(@"####LoadClass_category loading ");

    }

    @end

    int main(int argc, char *argv[])

    {

        @autoreleasepool {

        @autoreleasepool {

        NSLog(@"main Start");

        }

        returnUIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegateclass]));

        }

    }

    ```

    输出

    ```

    ####loading

    ####LoadClass_category loading

    ConstructorLoad

    main Start

    ```

    2 +initialize

    +initialize方法在一个比较安全的环境中调用,比+load更适合放入初始化代码。+initialize方法在类首次收到消息时调用,若此类一直没有使用,则+initialize就不会调用。 与+load方法类似的时,在向子类发送initialize消息前,总是会先向父类发送initialize消息,如果父类尚未调用+initialize方法则调用

    Category中的+initialize方法会覆盖类本身的+initialize方法。如果父类中实现了+initialize方法,而子类中没有重写此方法,则子类初始化时就会使用父类的方法。

    代码:

    ```

    #import

    @interface AbstractBase : NSObject

    @end

    @implementation AbstractBase

    + (void)initialize

    {

    NSLog(@"%@ initialize in ",self);

    }

    @end

    @interface SubClasss : AbstractBase

    @end

    @implementation SubClasss

    @end

    int main()

    {

    @autoreleasepool {

    NSLog(@"main Start");

    [SubClasss class];

    NSLog(@"main End");

    }

    return0;

    }

    **其输出为:**

    main Start

    AbstractBase initialize

    SubClasss initialize

    main End

    ```

    如果不想子类使用父类的+initialize方法,则父类的+initialize方法可以这样写

    ```

    + (void)initialize

    {

       if(self == [ParentClass class])

       {

         ... init..

       }

    }

    ```

    相关文章

      网友评论

          本文标题:Objective-C类初始化:load与initialize

          本文链接:https://www.haomeiwen.com/subject/rlxmyftx.html