initialize的理解和使用

initialize:

第一次初始化这个类之前被调用,可以用它来初始化一些静态变量。在创建子类的时候,子类会去调用父类的+ initialize方法,initialize方法的调用时机,当向该类发送第一个消息(一般是类消息首先调用,常见的是alloc)的时候,先调用类中的,再调用类别中的(类别中如果有重写);如果该类只是引用,没有调用,则不会执行initialize方法。如果子类如果有重写initialize,则在init之前会调用自己的initialize;如果没有的话就调用父类的initialize(这时候是子类son调用的)

load的调用

oad方法在这个文件被程序装载时调用。只要是在Compile Sources中出现的文件总是会被装载,这与这个类是否被用到无关,因此load方法总是在main函数之前调用。如果一个类实现了load方法,在调用这个方法前会首先调用父类的load方法。而且这个过程是自动完成的,并不需要我们手动实现

两者方法的共同点:自动调用父类的,不需要super操作;自动调用仅仅会调用一次(不包括外部显示调用)。

虽然initialize方法对一个类而言只会调用一次,但这里由于出现了两个类,所以调用两次符合规则,但不符合我们的需求。正确使用initialize方法的姿势如下:

// In Parent.m

+ (void)initialize {

          if(self== [Parentclass]){

                   NSLog(@"Initialize Parent, caller Class %@", [selfclass]);  

           }

}

加上判断后,就不会因为子类而调用到自己的initialize方法了。

首先要明确如果子类实现了load方法,调用子类的load方法时会调用到父类的load方法(相当于有一个 [super load],虽然没有写出来)。但是如果子类没有重写load方法,显然默认的load还是要调用的,但这时候不会因为调用子类的load方法而导致父类的load方法被调用。当然,如果父类方法本来就该被调用(项目引用到这个文件),那还是要在文件被装载的时候调用的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容