加载对象时常见的调用的方法
- - (instancetype)initWithCoder{} // 对象是从xib/storyboard创建的时候才会调用 initWithCoder
- - (instancetype)initWithFrame:(CGRect)frame {} // 使用代码创建的对象的时候调用initWithFrame
- - (instancetype)init{} // 方法内部调用initWithFrame方法
//能调用这个方法,表示对象创建好 - (void)awakeFromNib { NSLog(@"%s",__func__); } // 对象不一定创建好,设置数据可能无效 - (instancetype)initWithCoder:(NSCoder *)aDecoder{ if (self = [super initWithCoder:aDecoder]) { NSLog(@"%s",__func__); } return self; }
总结:
- 自定义从xib或者storyboard中的对象时,最好同时实现上面initWithCoder和awakeFromNib两个方法。
- 代码的方式自定义view对象时,应该调用initWithFrame或者init方法。
- (void)loadView:当第一次使用控制器的view的时候就会调用(也可以理解为当控制器的view要显示的时候就调用)
简单自定义如下: - (void)loadView { //错误原因:不能在自定义view中调用view的set方法,因为这时候还没有创建出view(view都还没有创建,拿来的尺寸呢) // UIView *view = [[UIView alloc]initWithFrame:self.view.frame];//出错
//1.自定义一个UIView UIView *view = [[UIView alloc]initWithFrame:[UIScreen mainScreen].bounds]; //2.将这个自定义的view赋值给控制器的view self.view = view; self.view.backgroundColor = [UIColor redColor]; //调用系统的那一套 // [super loadView]; }
+ (void)load{},加载类的时候调用。也就是说,ios应用启动的时候,就会加载所有的类,就会调用这个方法。
这样有个缺点,当加载类需要很昂贵的资源,或者比较耗时的时候,可能造成不良的用户体验,或者系统的抖动。这时候,就要考虑initialize方法了。这个方法可看作类加载的延时加载方法。类加载后并不执行该方法。只有当实例化该类的实例的时候,才会在第一个实例加载前执行该方法(懒加载)。
+ (void)initialize{} 会在运行时仅被触发一次,如果没有向类发送消息的话,这个方法将不会被调用。这个方法的调用是线程安全的。父类会比子类先收到此消息。
如果希望在类及其Categorgy中执行不同的初始化的话可以使用+(void)load, 这个方法对动态库和静态库中的类或(Category)都有效.
* 一个类的+load方法在其父类的+load方法后调用
* 一个Category的+load方法在被其扩展的类的自有+load方法后调用
要点:
1、initialize和load,我们并不需要在这两个方法的实现中使用super调用父类的方法。
2、load和initialize被调用一次是相对runtime而言 ,你可以当作普通类方法多次调用。
3、类加载到系统的时候就用调用load方法,类首次使用的时候调用initialize方法。
4、load不像普通方法一样遵从那套继承规则,当某个类没有实现 load方法,不管各级超类是否实现,系统都不会调用此类的load方法。initialize与其他方法一样,如果某个类没有实现initialize方法,而超类实现了,那么就会执行超类的这个方法.