Iphone 是否仍需要在viewDidUnload with ARC中将IBOUTLE属性设置为null

Iphone 是否仍需要在viewDidUnload with ARC中将IBOUTLE属性设置为null,iphone,objective-c,Iphone,Objective C,是否仍需要在viewDidUnload with ARC中将IBOutlet属性设置为null 因为它仍然会生成以下注释: //释放主视图中所有保留的子视图。禁用outlet的主要目的是避免在从视图控制器卸载视图时,当子视图没有超级视图时,可能会产生僵尸、泄漏和奇怪的情况 现在,在最新版本的Xcode中,如果您将视图元素拖到标题内或私有声明中,它会自动将Outlet设置为弱(目标iOS>=5),并且在viewDidUnload方法中,它会写入[self-setYourOutlet:nil]在这种

是否仍需要在viewDidUnload with ARC中将IBOutlet属性设置为null

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


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

禁用outlet的主要目的是避免在从视图控制器卸载视图时,当子视图没有超级视图时,可能会产生僵尸、泄漏和奇怪的情况

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

更新

为了避免误解(仅讨论iOS5),我想完成答案。请注意,IB仅当是主视图的子视图时才将outlet设置为weak。通常,它发生在包含来自视图控制器的视图的xib中


有时,您可能需要在运行时根据某些条件交换两个视图,而无需以编程方式或在不同的XIB中创建它们。例如,您的主视图归vc所有,在同一个xib中,您创建了两个其他视图,而在当时没有superview。如果您尝试使用相同的技术连接它们,则创建的引用将
strong
。在运行时,您现在可以交换视图,只需在superview中添加或删除视图。当然,您应该在
viewDidUnload

中取消它们。我将在这里扩展Andrea的答案(向上投票!),因为答案不是直截了当的,除非您只指UI组件,在这种情况下,它们应该都很弱

IBOutlets是您定义的任何东西。如果您使用:

@property(非原子,强)ibuiview*someView

卸载父视图/窗口时,应将其设为零

如果您这样做:

@property(非原子,弱)IBOutlet\uu弱UIView*someView

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

你怎么能做到零完全取决于你自己。在使用ARC I之前:

[someView\uuuu发布],someView=nil

现在有两个选项:要么使用setter(使用
@synthesis
创建),要么直接设置底层ivar。结果是一样的——在这两种情况下,对象的生存期限定符都会注意到它的最终用途并将其释放

因此,请继续这样做:

self.someView=nil


对于标记为strong的IBOutlet,您仍然希望在viewDidUnload中将其置零

原因:


当您收到内存不足通知时,任何当前不可见的视图都可以卸载自己(调用viewDidUnload)以节省内存。通过关闭你的门店,你放弃了所有权,让它们被释放。再次加载视图时(再次显示时),将再次设置插座并调用viewDidLoad。

可能重复+1这是正确答案。您必须将强引用设置为
nil
,以释放资源。没有必要将弱引用设置为
nil
,因为如果资源被释放,编译器将为您执行此操作。我认为ARC下的编译器也会将强属性设置为nil?这没关系-您无法读取它。弱属性在执行期间的任何时候都可能变为零。当您最终使用一个局部作用域对象时,您将其置零(导致编译器释放它),如果您继续使用它,您可以观察到一个nil值。或者,当对象超出范围时,您可以让编译器为您释放一个本地范围的对象,但离开范围意味着最终使用,因为您从未观察到nil值。强大的属性适用于您的类,因此隐含的释放发生在DeLoC中,在此之后您也不能访问该成员。为什么要考虑以下好的实践?[self-setYourOutlet:无];在这种情况下可能没有必要,但这是一个好的做法吗?@Ríomhaire好吧,想象一下,您需要将部署目标降低到4.3,在这种情况下,您只需要将“弱”更改为“不安全”
@synthesize someView = someView_;
...
someView_ = nil;