我知道以前曾问过类似的问题。但我现在已经搜索了一段时间了,事情仍然有点令人困惑。所以这里......
我没有使用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,因为它没有保留?
我错了吗?感谢任何帮助!
答案 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
),并使用所有属性。