在CS193p课程中,他们说在init方法中应该有一个if语句来检查[super init]
是否有效:
if (self = [super init]) {
self.someProperty = parameter;
}
return self;
我不明白为什么这样做,就好像[super init]
返回nil一样,无论if语句的结果如何,方法本身也会返回nil?
编辑:问题是;为什么将self = [super init]
放在if语句中。 (不是:为什么要self = [super init]
)
答案 0 :(得分:4)
这是有道理的,因为在某些情况下[super init]可以返回nil,在这种情况下,如果你试图访问某些ivar,你将会崩溃。
示例:
-(id) init {
self = [super init];
some_ivar = [[NSObject alloc] init]; //compiler treats this as self->some_ivar
//if self == nil you'll get EXC_BAD_ACCESS
return self;
}
答案 1 :(得分:1)
Apple在Objective-c programming guide详细解释了这一特定概念。 (向下滚动到“处理初始化失败”部分)
然而,Apple示例代码通常会将自我赋值保留在if语句之外
self = [super init];
if (self) {
//init stuff...
}
return self;
如果您使用的是LLVM 2.0编译器,它会给您一个警告,并告诉您将语句包装在括号中。像这样:
if ((self = [super init])) {
//init stuff...
}
return self;
答案 2 :(得分:0)
应该是if(self = [super init]){...
。 init
是一个实例方法,因此只能在已经alloc
'd的对象上调用。
答案 3 :(得分:0)
您需要调用[super init]以便超类可以执行它需要执行的任何一次性初始化。 init方法返回一个表示已初始化对象的指针。
将[super init]的结果分配回self是标准的Objective-C约定。如果超类作为其初始化工作的一部分返回与最初创建的对象不同的对象,则完成此操作。例如,NSString就是这样做的
所以它是自我= [超级初始化]
我从未见过[[super alloc] init],我一直使用[super init],据我所知,这就是惯例
答案 4 :(得分:0)
它不必在if
声明中
你可以很好地拥有它
self = [super init];
if ( self ) {
self.someProperty = parameter;
}
return self;
if语句用于检查self
是否已正确初始化并且可以安全self.someProperty = parameter
答案 5 :(得分:-1)
self = [[super alloc] init]; 创建一个基类 当您尝试调用仅子类方法时,运行时将会阻塞 以后。
self = [super init]; 是Objective-C的常见现象 当基类需要初始化变量值或实例化复合成员时, 否则它们是用Nil或(0)值创建的。