OC:load、init与initialize

区别:

 + (void) load+ (void) initialize- (id) init
执行时机在程序运行后立即执行在类的第一个方法第一次被调用 (即类接收到消息) 之前执行,同一个类只会执行一次,与对象个数的多少无关在对象实例化时调用,如 [[NSObject alloc] init],每实例化一个对象就会调用一次,
若自身未定义,是否沿用父类方法
类别中的定义全都执行,但主类优先于分类加载“覆盖”类中的方法,只执行一次“覆盖”类中的方法

 

 

 

 

 

load的常见用途

  • 在主函数运行之前,load 方法就会调用。
  • 由于它的调用不是惰性的,且其只会在程序调用期间调用一次 (所以runtime中交换方法的实现经常写在load方法中,可以确保方法仅交换一次),最最重要的是,如果在类与分类中都实现了 load 方法,它们都会被调用,不像其它的在分类中实现的方法会被覆盖,这就使 load 方法成为了方法调剂的绝佳时机。

init 与 initialize 的demo:

#import "LZPerson.h"

@implementation LZPerson

- (id)init {
    if (self = [super init]) {
        count++;
    }
    return self;
}

+ (void)initialize {
	static int count = 0;
}

+ (int)getCount {
	return count;
}

@end

--------------------------------------

int main( int argc, const char *argv[] ) {
	LZPerson *p1 = [[LZPerson alloc] init];  //在调用init之前会先调用initialize方法
	LZPerson *p2 = [[LZPerson alloc] init];  //调用init不会再调用initialize,只会调一次
	
	// print count
	NSLog(@"LZPerson count: %i", [LZPerson getCount] );//2
	
	LZPerson *p3 = [[LZPerson alloc] init];
	NSLog(@"LZPerson count: %i", [LZPerson getCount] );//3

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值