Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 释放对象时viewDidUnload和dealloc函数之间的差异_Iphone_Objective C_Cocoa Touch - Fatal编程技术网

Iphone 释放对象时viewDidUnload和dealloc函数之间的差异

Iphone 释放对象时viewDidUnload和dealloc函数之间的差异,iphone,objective-c,cocoa-touch,Iphone,Objective C,Cocoa Touch,我将变量设置为IBOutlet。 并在我的.h和.m文件中使用@property(retain)

我将变量设置为IBOutlet。 并在我的.h.m文件中使用
@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通知