Iphone 释放对象时viewDidUnload和dealloc函数之间的差异
我将变量设置为IBOutlet。 并在我的.h和.m文件中使用Iphone 释放对象时viewDidUnload和dealloc函数之间的差异,iphone,objective-c,cocoa-touch,Iphone,Objective C,Cocoa Touch,我将变量设置为IBOutlet。 并在我的.h和.m文件中使用@property(retain)
@property(retain)
。
像这样:
@interface testViewController {
NSArray *keys;
}
@property (nonatomic, retain) NSArray *keys;
@end
@implementation SectionViewController
@synthesize keys;
- (void)viewDidUnload {
self.keys = nil;
}
- (void)dealloc {
[super dealloc];
[keys release];
}
在许多书中,他们在viewDidUnload
方法中将该对象设置为nil,并在dealoc
方法中使用release方法释放该对象。
像这样:
@interface testViewController {
NSArray *keys;
}
@property (nonatomic, retain) NSArray *keys;
@end
@implementation SectionViewController
@synthesize keys;
- (void)viewDidUnload {
self.keys = nil;
}
- (void)dealloc {
[super dealloc];
[keys release];
}
我知道,如果我使用self.keys=nil,结果与dealloc
方法中的[keys release]
相同;对象键将被释放
,而“nil”将不会被保留
为什么有些书每次都用这种形式
谢谢首先,您的
-dealoc
方法将崩溃。您将对[super dealoc]
的调用放在了错误的位置。调用[super dealloc]
将导致对象被释放,因此在此调用之后对IVAR的任何引用都是引用垃圾内存。相反,您应该将其改写为
- (void)dealloc {
[keys release];
[super dealloc];
}
现在回答你的问题。似乎你想知道为什么人们在某些地方说
self.keys=nil
,而在dealoc中使用[keys release]
。有几个很好的理由。第一种情况是,某些人(几个月后的同事、你自己,或者如果你打开了你的源代码,则是用户)可能会在这个类或子类中重写setter-setKeys:
。该setter可能会对对象的状态做出一些假设,这些假设在-dealoc
中根本无效(例如,假设其他IVAR/属性仍然包含有效值)。如果做出了这样的假设,那么在-dealoc
中调用setter是不安全的。另一个更难追踪的原因是,对于键@“keys”
,可能有人在对象上具有活动的键值。调用self.keys=nil
将发出KVO通知,这不是您希望在dealloc中执行的操作。但是,说[keys release]
将完全跳过KVO通知。首先,您的-dealoc
方法将崩溃。您将对[super dealoc]
的调用放在了错误的位置。调用[super dealloc]
将导致对象被释放,因此在此调用之后对IVAR的任何引用都是引用垃圾内存。相反,您应该将其改写为
- (void)dealloc {
[keys release];
[super dealloc];
}
现在回答你的问题。似乎你想知道为什么人们在某些地方说self.keys=nil
,而在dealoc中使用[keys release]
。有几个很好的理由。第一种情况是,某些人(几个月后的同事、你自己,或者如果你打开了你的源代码,则是用户)可能会在这个类或子类中重写setter-setKeys:
。该setter可能会对对象的状态做出一些假设,这些假设在-dealoc
中根本无效(例如,假设其他IVAR/属性仍然包含有效值)。如果做出了这样的假设,那么在-dealoc
中调用setter是不安全的。另一个更难追踪的原因是,对于键@“keys”
,可能有人在对象上具有活动的键值。调用self.keys=nil
将发出KVO通知,这不是您希望在dealloc中执行的操作。但是,说[keys release]
将完全跳过KVO通知