Sno*_*man 3 inheritance objective-c ios
我有以下类和子类:
@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
Run Code Online (Sandbox Code Playgroud)
然后我在某处运行此代码:
NSLow *low = [[NSLow alloc] init];
assert(low.array);
Run Code Online (Sandbox Code Playgroud)
所以,显然,如果在子类中NSLow我合成了数组属性,那么来自超类的getter不会被调用,并且断言失败.
如果我不合成,则调用超类getter,并且断言通过.
NSLow不调用的情况下访问子类中的数组实例变量self.array?@synthesizein NSLow将创建以下getter:
- (NSArray *)array {
return _array;
}
Run Code Online (Sandbox Code Playgroud)
因此,您的数组永远不会被初始化并nil返回.
你一般不应使用@synthesize对@properties那些在父类定义.
此外,你不应该实现像那样的getter NSHigh.如果你想懒洋洋地初始化那个数组,你应该这样做:
- (NSArray *)array {
if (!_array) {
_array = [[NSArray alloc] init];
}
return _array;
}
Run Code Online (Sandbox Code Playgroud)
最后,你不应该使用NS前缀.
编辑:
如果您想在子类中直接访问您的ivar,您可以在标题中明确声明它,如下所示:
@interface NSHigh : NSObject {
NSArray *_array;
}
@property (nonatomic, strong) NSArray *array;
@end
Run Code Online (Sandbox Code Playgroud)
这将允许您访问子类中的ivar.
| 归档时间: |
|
| 查看次数: |
3835 次 |
| 最近记录: |