我收到分析器警告,因为升级...
Returning 'self' while it is not set to the result of '[(super or self) init...]'
不知道有什么问题?
- (id)initWithFrame:(CGRect)frame {
if (self == [super initWithFrame:frame]) {
[self initLayers];
}
return self;
}
我收到分析器警告,因为升级...
Returning 'self' while it is not set to the result of '[(super or self) init...]'
不知道有什么问题?
- (id)initWithFrame:(CGRect)frame {
if (self == [super initWithFrame:frame]) {
[self initLayers];
}
return self;
}
去掉第二个等号。正确的if
说法是:
if(self = [super initWithFrame:frame])
这样做的重点是,超级实现可能会返回一个与 self 的当前值不同但仍然有效的对象。在这种情况下,您的 if 语句将是错误的,因为对象不同,因此您的初始化不会发生。但是,由于它返回了一个不同的对象,超级实现应该已经释放了旧的自我,这就是你要返回的东西。这意味着您可能返回了一个无效的指针。
通过仅使用一个等号,您可以设置变量而不是比较它。因为if(object)
is true if object
is not nil
,所以它等价于:
if((self = [super initWithFrame:frame]) != nil)
或者,更容易理解的版本:
self = [super initWithFrame:frame];
if(self != nil)
此代码重新分配self
为超级初始化程序返回的值,而不是仅仅假设返回的值是相同的。这就是为什么将变量设置为init...
方法的结果而不是alloc
.
// good
id object = [[MyClass alloc] init];
// bad
id object = [MyClass alloc];
[object init];
如果我没记错的话,语法self = ...
不是self == ...
. 该语法使用赋值的返回值。
你返回的自我没有初始化
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
[self initLayers];
}
return self;
}