iOS Objective-C 中的 initialize 和 init 的介绍
2016-03-21 15:32
671 查看
initialize不是init.
OC中运行时间的行为之一就是initialize。虽然看起来有点像大家常见的init,但是他们并不相同。
在程序运行过程中,它会在你程序中每个类调用一次initialize。这个调用的时间发生在你的类接收到消息之前,但是在它的父类接收到initialize之后。
例如,我们创建一个 Person 类,在这里记录 initialize 和 init 调用的时间:
然后创建 Person 类的两个对象实例:
输出的结果为:
可以看到,虽然我们创建了Person的两个实例,但是initialize仅仅被调用了一次。也可以看到,直到我们创建了一个Person的实例,initialize才被调用。
但是如果Person有一个子类的话,比如我们建一个Person的子类叫做Student:
注意: 在 Student 的 .m 文件中,并没有实现initialize方法。
现在我们同样创建 Student 类的一个实例对象,并运行程序:
输出结果为:
从这个结果可以看出,输出的结果是 Person 的3个 init 方法和2个 initialize 方法。由此可以看出:如果一个子类没有实现initialize方法,那么父类会调用这个方法两次,一次为自己,另一次为子类。
为了方便我们看得更清楚,我们在 initialize 方法中记录下类名:
输出结果:
如果我们希望确定只用了initialize一次用来实现某些单独运行的工作,或者希望实现仅仅运行一次的方法,检查一下[self class],才能确定是否是你希望做到的效果。
OC中运行时间的行为之一就是initialize。虽然看起来有点像大家常见的init,但是他们并不相同。
在程序运行过程中,它会在你程序中每个类调用一次initialize。这个调用的时间发生在你的类接收到消息之前,但是在它的父类接收到initialize之后。
例如,我们创建一个 Person 类,在这里记录 initialize 和 init 调用的时间:
#import "Person.h" @implementation Person +(void)initialize { NSLog(@"%s", __FUNCTION__); } -(instancetype)init { NSLog(@"%s", __FUNCTION__); return self; } +(void)load { NSLog(@"%s", __FUNCTION__); } @end
然后创建 Person 类的两个对象实例:
@interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; Person *p1 = [[Person alloc]init]; Person *p2 = [[Person alloc]init]; }
输出的结果为:
可以看到,虽然我们创建了Person的两个实例,但是initialize仅仅被调用了一次。也可以看到,直到我们创建了一个Person的实例,initialize才被调用。
但是如果Person有一个子类的话,比如我们建一个Person的子类叫做Student:
#import "Person.h" @interface Student : Person @end #import "Student.h" @implementation Student @end
注意: 在 Student 的 .m 文件中,并没有实现initialize方法。
现在我们同样创建 Student 类的一个实例对象,并运行程序:
Student *s = [[Student alloc]init];
输出结果为:
从这个结果可以看出,输出的结果是 Person 的3个 init 方法和2个 initialize 方法。由此可以看出:如果一个子类没有实现initialize方法,那么父类会调用这个方法两次,一次为自己,另一次为子类。
为了方便我们看得更清楚,我们在 initialize 方法中记录下类名:
+(void)initialize { NSLog(@"%s %@", __FUNCTION__, [self class]); }
输出结果:
如果我们希望确定只用了initialize一次用来实现某些单独运行的工作,或者希望实现仅仅运行一次的方法,检查一下[self class],才能确定是否是你希望做到的效果。
相关文章推荐
- GitHub 上排名前 100 的 Objective-C 项目简介
- object有哪些公用方法
- PHP SPL中提供了SplFileInfo和SplFileObject两个类来处理文件操作
- Objective-c 中CGGeometry几何类常用方法简单整理
- HTML插入Flash的全兼容完美解决方案-SWFObject
- 字符串转换成JSONObject
- JSONObject获取key值报空指针
- dede Fatal error: Call to a member function read() on a non-object
- SQL:object_id的应用
- Java day07 复写Object 类的equals(Object)方法
- Object.create() 是什么?继承(继承特定的)
- 为GCD队列绑定NSObject类型上下文数据-利用__bridge_retained(transfer)转移内存管理权-备
- Objective-C和Java的简单对比
- TStack,TQueue,TObjectList,TObjectStack等等
- Jackson 忽略不需要的字段
- Objective-c UIViewController原生态跳转动画
- JVM —— Object Header(对象头)
- MATLAB dlopen: cannot load any more object with static TLS
- Java 如何对文件进行多个Object对象流的读写操作
- java实现map和object互转的三种方法