我是不是必须“释放”我声明为具有属性属性“保留”和“非原子”的 IBOutlets 的 UI 对象?
Posted
技术标签:
【中文标题】我是不是必须“释放”我声明为具有属性属性“保留”和“非原子”的 IBOutlets 的 UI 对象?【英文标题】:Do I have to "release" my UI objects that I declared as IBOutlets with property attributes "retain" and "nonatomic"?我是否必须“释放”我声明为具有属性属性“保留”和“非原子”的 IBOutlets 的 UI 对象? 【发布时间】:2010-07-26 20:47:39 【问题描述】:我是否必须“释放”我声明为具有属性属性“保留”和“非原子”的 IBOutlets 的 UI 对象?我问是因为我有一个这样声明的 UI var...
@interface MyViewController : UIViewController
IBOutlet UILabel *lblStatus;
@property (retain, nonatomic) IBOutlet UILabel *lblStatus;
@end
我的dealloc也是这样......
- (void)dealloc
//[lblStatus release];
[super dealloc];
在注释掉 lblStatus
UI 变量的情况下,当我从导航堆栈中弹出视图时,Instruments 似乎没有检测到任何泄漏。
提前感谢您的帮助!
【问题讨论】:
【参考方案1】:既然它们被保留,是的,你有责任释放它们。通常,对于视图控制器,这应该发生在 -viewDidUnload
中,如下所示:
- (void)viewDidUnload
self.lblStatus = nil;
[super viewDidUnload];
(使用合成的retain
访问器设置属性的值,将在将实例变量设置为新值之前释放旧值。)
【讨论】:
谢谢,诺亚!如果我在我的 dealloc 方法中取消注释“释放”语句,这也足够了吗?另外,关于为什么 Instruments 没有通过注释掉“发布”声明来发现泄漏的任何想法?再次感谢。 不完全是。如果你的视图被卸载并再次加载——例如,如果你的视图控制器离开屏幕,收到内存警告,然后再次出现在屏幕上——那么它将被重新实例化,并且任何保留的出口(如你的标签)可能会泄漏。 @Pierre,不完全是;有可能 NIB 加载系统足够智能,可以检测到插座已经连接,而不需要重新实例化。不过,我不会依赖它,在我的应用程序中,我假设每个 -loadView 都有效地从头开始。以上是关于我是不是必须“释放”我声明为具有属性属性“保留”和“非原子”的 IBOutlets 的 UI 对象?的主要内容,如果未能解决你的问题,请参考以下文章
如何解决这个错误? “具有‘保留(或强)’属性的属性必须是对象类型”
Objective-C - 我是不是需要取消分配未使用的保留属性?