我是不是必须“释放”我声明为具有属性属性“保留”和“非原子”的 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 - 我是不是需要取消分配未使用的保留属性?

我应该在重新分配之前调用分配给保留属性的自动释放对象的释放吗?

为什么代理属性设置成assign为了防止生成保留环来