3

我收到分析器警告,因为升级...

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;
}
4

3 回答 3

13

去掉第二个等号。正确的if说法是:

if(self = [super initWithFrame:frame])

这样做的重点是,超级实现可能会返回一个与 self 的当前值不同但仍然有效的对象。在这种情况下,您的 if 语句将是错误的,因为对象不同,因此您的初始化不会发生。但是,由于它返回了一个不同的对象,超级实现应该已经释放了旧的自我,这就是你要返回的东西。这意味着您可能返回了一个无效的指针。

通过仅使用一个等号,您可以设置变量而不是比较它。因为if(object)is true if objectis 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];
于 2011-11-09T22:13:36.360 回答
3

如果我没记错的话,语法self = ...不是self == .... 该语法使用赋值的返回值。

于 2011-11-09T22:06:25.953 回答
2

你返回的自我没有初始化

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        [self initLayers];
    }
    return self;
}
于 2011-11-09T22:06:02.847 回答