2010-10-27 74 views
0

在任何iPhone模板UIViewController类,你会看到这样一个问题:iphone关于过度释放

- (void)viewDidUnload { 

    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 

但如果我设置self.myOutlet =零在viewDidUnload,我也有[self.myOutlet发布]在dealloc方法中,是不是过度释放self.myOutlet,因为将它设置为零将已经将其保留计数设置为零?

如果我不在的dealloc()释放,泄漏报告内存泄漏,因为它永远不会看到self.myOutlet得到释放,假设我有在头文件是这样的:

@property (nonatomic, retain) UIView *myOutlet; 

回答

2

如果您在viewDidUnload中将self.myOutlet设置为nildealloc[myOutlet release]中的呼叫将简单地向nil发送发布消息。将消息发送到nil是完全可以接受的。没有什么不好的事情会发生,你不会过度释放任何东西。

需要注意的是释放被myOutlet引用的对象viewDidUnload事情没有设置myOutletnil。在这种情况下,您将在dealloc中遇到崩溃。为什么?因为myOutlet仍然指的是myOutlet对象曾经占用的内存位置,并且您的dealloc方法将尝试发送当前位于该内存位置的任何消息。release消息。被发出的存储器警告时

+0

谢谢你们。这正是我希望听到的。 – sol 2010-10-28 00:16:23

1

-(void)viewDidUnload被调用时,-(void)dealloc是所谓的完全破坏视图的(这些是不相同)。因此,你应该做两

- (void)viewDidUnload { 

    // Release any retained subviews of the main view. 
    self.myOutlet = nil; 
} 
- (void)dealloc { 
    [self.myOutlet release]; 
} 

编辑:什么詹姆斯说,进一步加强了点。

干杯!

1

这不是具有保留计数的变量;这是对象。当您执行self.something = nil时,它确实释放了对象 - 并将变量设置为指向nil。因此,发送到self.something的任何进一步release消息都不会转到原始对象。相反,他们转到新值nil,该值愉快地忽略了您所说的任何内容。