我将变量设置为IBOutlet。
并在我的 .h 和 .m 文件中使用@property(retain)
@synthesize
。
像这样:
@interface testViewController {
NSArray *keys;
}
@property (nonatomic, retain) NSArray *keys;
@end
@implementation SectionViewController
@synthesize keys;
在很多书中,他们在viewDidUnload
方法中将该对象设置为nil,并使用release方法在dealloc
方法中释放该对象。
像这样:
- (void)viewDidUnload {
self.keys = nil;
}
- (void)dealloc {
[super dealloc];
[keys release];
}
据我所知,如果我使用self.keys = nil,则结果与[keys release]
方法中的dealloc
相同;对象键将为release
,而“nil”将不会保留。
为什么有些书每次都会使用此表单?
由于
答案 0 :(得分:5)
首先,您的-dealloc
方法会崩溃。您已将呼叫[super dealloc]
置于错误的位置。调用[super dealloc]
将导致您的对象被释放,因此在此调用之后对ivars的任何引用都引用了垃圾内存。相反,你应该重写这个
- (void)dealloc {
[keys release];
[super dealloc];
}
现在回答你的问题。您似乎想知道人们为什么在某些地方说self.keys = nil
,但在dealloc中使用[keys release]
。有几个很好的理由。第一个是某人(一个同事,你自己几个月后,或者一个用户,如果你开源你的代码)可能会覆盖这个类或子类中的setter -setKeys:
。该setter可以假设对象的状态在-dealloc
中无效(例如,假设其他ivars /属性仍然包含有效值)。如果做出这样的假设,那么在-dealloc
中调用setter是不安全的。另一个难以追踪的原因是某人可能会在您的对象上为密钥@"keys"
进行有效的键值观察注册。调用self.keys = nil
将触发KVO通知,这不是您想要在dealloc中执行的操作。但是,说[keys release]
将完全跳过KVO通知。