【发布时间】:2012-03-04 00:13:27
【问题描述】:
我的应用有一点不常见的情况,就是
每次要显示视图时,我都必须重新加载一些保留属性,
代码如下所示:
// .h
@property (nonatomic, retain) NSArray *myData;
// .m
@synthesize myData;
- (void)viewWillAppear:(BOOL)animated {
... // get FetchRequest and so on
self.myData = [self.context executeFetchRequest:request error:&error]; // Line 1
[super viewWillAppear:animated];
}
- (void)viewDidUnload {
self.myData = nil;
[super viewDidUnload];
}
- (void)dealloc {
[myData release]; // Line 2
[super dealloc];
}
有几点:
第一。如您所见,属性“myData”是保留,所以我认为我为它设置了一些对象,它会自动保留该对象?
第二。每次出现视图时我都必须重新加载“myData”,就像上面第 1 行的代码一样。
第三。由于它是一个retain属性,所以我必须自己正确释放它。
现在,问题是,我是否正确地管理了内存,而没有使用上面的代码泄漏任何“myData”?
如果视图在解除分配之前会出现多次,(例如在 UINavigationController 中推入另一个视图并弹出多次),
那么 myData 会多次保留某个对象,但我只在第 2 行的 dealloc for 1 中释放它一次,这样可以吗?
但是如果我将此方法添加到 viewController,我认为这对于避免内存泄漏更安全:
- (void)viewWillDisappear:(BOOL)animated {
self.myData = nil;
[myData release];
[super viewWillDisappear:animated];
}
- (void)dealloc {
// [myData release]; // don't release it here.
[super dealloc];
}
在我推入并弹出视图一两次后,我的应用程序会崩溃,
那么到底哪一个是错的呢?
非常感谢!
【问题讨论】:
标签: ios memory-management properties retain