3

我有以下类和子类:

@interface NSHigh : NSObject
@property (nonatomic, strong) NSArray *array;
@end
@implementation NSHigh
-(NSArray*)array
{
    _array = [[NSArray alloc] init];
    return _array;
}
@end

@interface NSLow : NSHigh
@end
@implementation NSLow
/* synthesizing makes the assertion FAIL. NO synthesizing makes the assertion PASS */
@synthesize array;
@end

然后我在某处运行这段代码:

NSLow *low = [[NSLow alloc] init];
assert(low.array);

因此,显然,如果NSLow我在子类中合成了数组属性,那么来自超类的 getter 不会被调用,并且断言失败。

如果我不合成,则调用超类 getter,并且断言通过。

  1. 为什么会这样?
  2. 我如何在不每次NSLow调用的情况下访问子类中的数组实例变量?self.array
4

1 回答 1

8

@synthesizeinNSLow将创建以下吸气剂:

- (NSArray *)array {
    return _array;
}

因此,您的数组永远不会被初始化并被nil返回。

你通常不应该使用@synthesize@properties超类中声明的。

此外,您不应该实现像NSHigh. 如果你想懒惰地初始化那个数组,你应该这样做:

- (NSArray *)array {
    if (!_array) {
        _array = [[NSArray alloc] init];
    }
    return _array;
}

最后,你不应该使用NS前缀。

编辑:

如果您想在子类中直接访问您的 ivar,您可以在标头中显式声明它,如下所示:

@interface NSHigh : NSObject {
    NSArray *_array;
}
@property (nonatomic, strong) NSArray *array;
@end

这也将允许您访问子类中的 ivar。

于 2012-10-03T00:02:08.587 回答