正确使用viewDidUnload

时间:2012-04-23 16:24:55

标签: iphone objective-c ios memory-management viewdidunload

我知道以前曾问过类似的问题。但我现在已经搜索了一段时间了,事情仍然有点令人困惑。所以这里......

我没有使用ARC。 如果你有一个带有实例变量和类似属性的viewcontroller:

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,因为它没有保留?

我错了吗?感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

self.someView = nil不会泄漏,因为它等于由[self setSomeView:nil]的属性合成对自动生成的@property(nonatomic, retain)UIView *someView。它具有retain属性,因此在设置新对象时将释放保留的对象。

我相信[someDict release];应该在dealloc。并且[someOtherView release];不应该被调用,因为它是assign属性,没有所有权。

更多参考资料:

答案 1 :(得分:1)

viewDidUnload中,您应该释放并忽略视图控制器主视图保留子视图的所有视图(即不是字典!)。就这么简单。

所以你的

self.someView = nil;

是正确的,只需将所有其他保留的子视图添加到方法中。

不要发布someOtherView,因为这是指定的属性。发布它会导致您的应用崩溃。

如果我是你,我将摆脱iVar声明(someDict),并使用所有属性。