1

我知道以前有人问过类似的问题。但是我已经搜索了一段时间了,事情仍然有些混乱。所以这里...

我没有使用 ARC。如果您有一个带有实例变量和如下属性的视图控制器:

视图控制器.h:

@interface ViewController : UIViewController{
    NSDictionary *someDict;
}
@property(nonatomic, retain)UIView *someView;
@property(assign)UIView *someOtherView;

视图控制器.m:

-(void)viewDidUnload{
    self.someView = nil;
    [someDict release];
    [someOtherView release];
    super viewDidUnload];
} 

这是实现 viewDidUnload 的正确方法吗?设置 someDict = nil 似乎是错误的,因为它会泄漏,因此我的猜测是释放。这同样适用于 someOtherView 因为它没有保留?

我在这里错了吗?感谢您的帮助!

4

2 回答 2

2

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

我相信[someDict release];应该在dealloc. 并且[someOtherView release];不应该被调用,因为它是一个assign没有所有权的财产。

更多参考:

于 2012-04-23T16:39:18.387 回答
1

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

所以你的

self.someView = nil;

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

不要 release someOtherView,因为这是一个分配的属性。释放它会导致你的应用程序崩溃。

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

于 2012-04-23T16:43:24.667 回答