我仍然需要在使用ARC的viewDidUnload中将IBOutlet属性设置为null

The*_*ner 10 iphone objective-c

我还需要在使用ARC的viewDidUnload中将IBOutlet属性设置为null吗?

因为它仍然会生成以下注释:

//释放主视图的所有保留子视图.

And*_*rea 13

那么nilling出口的主要目的是在视图从视图控制器卸载时,不会创建当子视图没有超级视图时可能发生的僵尸,泄漏和奇怪的情况.

现在使用最新版本的Xcode,如果你在一个标题或私有声明中拖动一个视图元素,它会自动将Outlet设置为弱(目标iOS> = 5),并且在这种情况下viewDidUnload[self setYourOutlet:nil];可能会写入的方法也没有必要,但这是一个很好的做法.如果你的目标是较低的需要,因为你不能使用弱引用.我建议总是使用,因为这是一个好习惯.

UPDATE

我想完成答案以避免误解(仅谈论iOS5)注意只有当主视图的子视图时,IB才会设置弱点.通常,它发生在包含视图控制器视图的xib中.

有时可能会发生需要在运行时根据某些条件交换两个视图而无需以编程方式或在不同的xib中创建它们.例如,您拥有vc所拥有的主视图,并且在同一个xib中,您创建了另外两个视图,在那一刻没有超视图.如果您尝试使用相同的技术连接它们,则创建的引用将是strong.在运行时,您现在可以交换视图,只需添加或从超级视图中删除,当然您应该将它们纳入其中viewDidUnload.


Mat*_*ton 11

我将在这里对安德烈的回答扩大(给予好评他!),因为答案是不是直线前进,除非你只意味着UI组件,在这种情况下,他们应该弱.

IBOutlets是您定义它们的任何东西.如果您使用:

@property (nonatomic, strong) IBOutlet UIView *someView;

在卸载父视图/窗口时,您应该这样做.

如果你这样做:

@property (nonatomic, weak) IBOutlet __weak UIView *someView;

您不必将变量设为零,因为它将自动归零.

你怎么样都完全取决于你.ARC之前我使用过:

[someView_ release], someView_ = nil;

现在您有两个选择:使用setter(使用with创建@synthesize)或直接设置底层ivar.结果是相同的 - 在这两种情况下,对象的生命周期限定符都会注意到它的最终用途并将其释放.

所以,继续这样做:

self.someView = nil

要么

@synthesize someView = someView_;
...
someView_ = nil;
Run Code Online (Sandbox Code Playgroud)

  • +1这是正确的答案.您必须设置对"nil"的强引用才能释放资源.没有必要设置对"nil"的弱引用,因为如果资源被释放,编译器将为您执行此操作. (4认同)

Ree*_*ean 2

对于标记为强的 IBOutlet,您仍然希望在 viewDidUnload 中将它们清零。

为什么:

当您收到内存不足通知时,当前不可见的任何视图都可能会自行卸载(调用 viewDidUnload)以节省内存。通过清空你的网点,你就放弃了所有权并让它们被释放。当再次加载视图时(再次显示时),将再次设置出口并调用 viewDidLoad 。