曾经阅读过苹果公司官方文档“Advanced Memory Management Programming Guide”,对于为什么不能在init和dealloc方法中使用accessor方法一事,一直不明白。自己平时的工作实践中,貌似也没发现过有啥问题。直到今天,在调试一个错误的时候,才猛然间明白了其中的原因。
之所以不能在init和dealloc中使用accessor,是因为我们要提防:子类有可能会覆盖父类的accessor方法,从而改变accessor方法的行为。
参考代码:
#import <Foundation/Foundation.h>
@interface Test : NSObject
@property (nonatomic, retain) NSString * str;
@end
@implementation Test
- (id)init
{
self = [super init];
if(self){
self.str = @"aaa";
}
return self;
}
@end
@interface Test1 : Test
@end
@implementation Test1
- (void)setStr:(NSString *)str
{
[super setStr: [NSString stringWithFormat:@"[%@]", str]];
}
@end
int main()
{
@autoreleasepool{
Test *test = [[Test new] autorelease];
NSLog(@"test=%@", test.str);
Test1 *test1 = [[Test1 new] autorelease];
NSLog(@"test1=%@", test1.str);
return 0;
}
}
输出结果:
test=aaa
test1=[aaa]