Iphone 正确使用viewDidUnload
我知道以前也有人问过类似的问题。但我已经搜索了一段时间了,事情还是有点混乱。所以这里是 我没有使用弧。 如果您有一个带有实例变量和如下属性的viewcontroller: ViewController.h:Iphone 正确使用viewDidUnload,iphone,objective-c,ios,memory-management,viewdidunload,Iphone,Objective C,Ios,Memory Management,Viewdidunload,我知道以前也有人问过类似的问题。但我已经搜索了一段时间了,事情还是有点混乱。所以这里是 我没有使用弧。 如果您有一个带有实例变量和如下属性的viewcontroller: ViewController.h: @interface ViewController : UIViewController{ NSDictionary *someDict; } @property(nonatomic, retain)UIView *someView; @property(assign)UIView
@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似乎是错误的,因为它会泄漏,因此我猜测是释放。
这同样适用于其他视图,因为它未被保留
我错了吗?谢谢你的帮助
self.someView=nil
不会泄漏,因为它等于由@property(非原子,保留)UIView*someView的属性对自动生成的[self-setSomeView:nil]
。它具有retain
属性,因此设置新对象时将释放保留的对象
我相信[someDict release]代码>应位于dealloc
中。和[someOtherView发布]不应调用code>,因为它是一个不具有所有权的assign
属性
更多参考资料:
在viewDidUnload
中,您应该释放并取消作为视图控制器主视图的保留子视图的所有视图(即,不是字典!)。就这么简单
那么你的
self.someView = nil;
如果正确,只需将所有其他保留的子视图也添加到该方法中
不要释放someOtherView
,因为这是一个已分配的属性。释放它将导致应用程序崩溃
如果我是你,我会去掉iVar声明(someDict
),使用所有属性。我相信如果你使用的是ARC,那么你只需要使用someDict=nil代码>我没有使用ARC。。。这就是editnice的问题,我相信这个问题是新的iOS程序员提出的第一个问题。谢谢回答!第一个我很确定,但是另外两个呢?任何线索?someDict
都是您的类的成员,在实例被销毁之前不应发布<代码>查看卸载
位置不正确。对于someOtherView
,它看起来像是对另一个视图的弱引用,这就是我这么说的原因。在我的回答中添加了更多引用。那么你的意思是,如果字典someDict是一个视图,它应该被发布,因为它不是保留属性?SomeOther观点也是如此?我接受了你关于清除所有IVAR的建议,但这提出了一个问题。继承权呢?