2011-02-15 68 views
0

我将变量设置为IBOutlet。 并使用@property(retain)@synthesize在我的.h.m文件中。 像这样:当我释放对象时,viewDidUnload和dealloc函数之间的区别

@interface testViewController { 

    NSArray *keys; 

} 

@property (nonatomic, retain) NSArray *keys; 

@end 

@implementation SectionViewController 

@synthesize keys; 

在很多书,他们设置对象为nil在viewDidUnload方法和使用的排放方法来释放对象dealloc方法。 像这样:

- (void)viewDidUnload { 
    self.keys = nil; 
} 


- (void)dealloc { 
    [super dealloc]; 
    [keys release]; 
} 

据我所知,如果我使用self.keys =零,结果是相同[keys release]dealloc方法;对象键将release,和“无”将不被保留。

为什么有些书每次都使用这种形式?

感谢

回答

5

首先,你-dealloc将崩溃。您已将该电话打到[super dealloc]错误的地方。调用[super dealloc]将导致你的对象被释放,所以在这次调用之后对ivars的任何引用都引用了垃圾内存。相反,你应该重写这是

- (void)dealloc { 
    [keys release]; 
    [super dealloc]; 
} 

现在回答你的问题。看来你想知道为什么人们在某些地方说self.keys = nil,但在dealloc中使用[keys release]。有几个很好的理由。首先是某人(一个同事,几个月后你的自己,或者一个用户,如果你开源代码的话)可以在这个类中或者在一个子类中覆盖setter -setKeys:。该设置者可能会假设该对象的状态在-dealloc中无效(例如,假定其他ivars /属性仍包含有效值)。如果做出这样的假设,那么在-dealloc中调用setter并不安全。难以追踪的另一个原因是某人可能在您的物品上有关键值观察注册,对于@"keys"。调用self.keys = nil将触发KVO通知,这不是您想要在dealloc中执行的操作。但是,说[keys release]将完全跳过KVO通知。

+0

相关知识键值观察,谢谢! – Nianliang 2012-06-16 15:32:35

相关问题