再说之前我先看一个问题 假如有一个View 代码如下:
@implementation MyView
- (id)init {
self = [super init];
if (self) {
NSLog(@" init");
}
return self;
}
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
NSLog(@"initWithFrame");
}
return self;
}
如果我们在实例化这个view 的有时候 如果我们用:
MyView *myView =[ [MyView alloc] init];
结果会输出什么?
再如果我们这样用
MyView *myView =[ [MyView alloc] initWithFrame:CGRectZero];
结果又会输出什么?
我们先看第一种输出结果:
第二种输出结果:
为什么会这样子呢?它们二者又有什么关系呢?
我们知道 Objective-C 有指定初始化方法(designated initializer)和间接(secondary initializer)初始化方法的观念。 designated 初始化方法是提供所有的参数,secondary 初始化方法是一个或多个,并且提供一个或者更多的默认参数来调用 designated 初始化的初始化方法。如果你对这两个方法不熟悉( 这本书里说的很详细也很好,在这里我就不复制了,如果你有兴趣了解更多那就下载下来好好看看吧) 请参考这篇文章 https://github.com/oa414/objc-zen-book-cn/#designated-initializer 这里面有详细说明。请仔细阅读理解,如果认真看完了那么你点开UIView.h 文件看看你可以看到:
- (instancetype)initWithFrame:(CGRect)frame NS_DESIGNATED_INITIALIZER;
再回头看看上面的问题你是不是理解了呢?