我知道以前也有人问过类似的问题。但我已经搜索了一段时间,现在事情仍然有点困惑。所以开始吧..。
我没有使用ARC。如果您有一个带有实例变量和属性的视图控制器,如下所示:
ViewController.h:
@interface ViewController : UIViewController{
NSDictionary *someDict;
}
@property(nonatomic, retain)UIView *someView;
@property(assign)UIView *someOtherView;ViewController.m:
-(void)viewDidUnload{
self.someView = nil;
[someDict release];
[someOtherView release];
super viewDidUnload];
} 这是实现viewDidUnload的正确方式吗?设置someDict = nil似乎是错误的,因为它会泄漏,因此我猜是释放。同样的情况也适用于someOtherView,因为它没有被保留?
我说错了吗?感谢您的帮助!
发布于 2012-04-24 00:39:18
self.someView = nil不会泄漏,因为它等于由@property(nonatomic, retain)UIView *someView的属性合成对自动生成的[self setSomeView:nil]。它具有retain属性,因此在设置新对象时将释放保留的对象。
我认为[someDict release];应该在dealloc中。而且不应该调用[someOtherView release];,因为它是一个没有所有权的assign属性。
更多参考资料:
发布于 2012-04-24 00:43:25
在viewDidUnload中,您应该释放并清空作为视图控制器主视图(即不是字典!)的保留的子视图的所有视图。就这么简单。
所以你的
self.someView = nil;是正确的,只需将所有其他保留的子视图也添加到该方法中。
不要释放someOtherView,因为这是一个已分配的属性。发布它会导致你的应用程序崩溃。
如果我是您,我会去掉iVar声明(someDict),使用所有的属性。
https://stackoverflow.com/questions/10284403
复制相似问题