释放Object时viewDidUnload和dealloc函数之间的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了释放Object时viewDidUnload和dealloc函数之间的区别相关的知识,希望对你有一定的参考价值。

我将变量设置为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”将不会保留。

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

谢谢

答案

首先,你的-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是不安全的。另一个难以追踪的原因是某人可能在您的对象上有一个有效的Key-Value Observing注册,用于密钥@"keys"。调用self.keys = nil将触发KVO通知,这不是你想要在dealloc中做的事情。但是,说[keys release]将完全跳过KVO通知。

以上是关于释放Object时viewDidUnload和dealloc函数之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

ios6 中不再调用 viewDidUnload

拆除 UIViewController 时是不是总是调用 viewDidUnload 和 dealloc?

[转]ViewController的生命周期

关于 ARC for iOS 的几个问题?

UIViewController 关闭时不接收 dealloc 或 viewDidUnload

释放属性的简单模式