是否需要在dealloc中将outlet变量设置为nil(即使在IOS 3.0之后)?
在苹果的<内存管理 >谈论奥特莱斯时的记录。
它说
在您的自定义视图控制器类中 你可以实现 viewDidUnload 来 调用您的访问器方法来设置 出口为零。
我可以理解这一点,因为在这种情况下调用访问器方法来设置 nil 将释放对象并将指针设置为 nil 可以防止访问可能导致崩溃的无效点。
但在那之后,它说:
注意:在 3.0 之前的 iOS 上, viewDidUnload 方法不可用。 相反,你应该将出口设置为零 在 setView: 中,如图所示 示例:
- (void)setView:(UIView *)aView { if (!aView) { // View 被设置为 nil。 // 将 Outlet 设置为 nil,例如 self.anOutlet = nil; } // 最后调用 super 的实现。 [超级setView:aView]; }
此外,由于一个细节 dealloc 的实现 UIViewController,你还应该设置 dealloc 中的出口变量为零:
- (void)dealloc { // 释放outlet并将outlet变量设置为nil。 [anOutlet 释放], anOutlet = nil; [超级释放]; }
1)为什么即使在 dealloc 中我们也需要设置 nil? (我认为dealloc是对象生命周期的最后一步,没有其他人可以通过这个对象访问outlet。)
2)在iOS 3.0或更高版本中我们还需要设置nil吗?(我发现Xcode自动生成的代码不不要将输出变量设置为零,只释放它们。)
In apple's <Memory Management> Document when talking about Outlets.
It says
in your custom view controller class
you can implement viewDidUnload to
invoke your accessor methods to set
outlets to nil.
I can understand this, since in this case invoke the accessor methods to set nil will release the object and set the pointer to nil can prevent an access to invalid point which may cause crash.
But after that , it says:
Note: On iOS prior to 3.0, the
viewDidUnload method is not available.
Instead you should set outlets to nil
in setView:, as illustrated in this
example:- (void)setView:(UIView *)aView { if (!aView) { // View is being set to nil. // Set outlets to nil, e.g. self.anOutlet = nil; } // Invoke super's implementation last. [super setView:aView]; }
In addition, because of a detail of
the implementation of dealloc in
UIViewController, you should also set
outlet variables to nil in dealloc:- (void)dealloc { // Release outlets and set outlet variables to nil. [anOutlet release], anOutlet = nil; [super dealloc]; }
1)Why even in dealloc we need to set nil? (I think dealloc is the last step of a object life-cycle, nobody else can access the outlet through this object.)
2)Do we still need to set nil in iOS 3.0 or later?( I found the code Xcode automatically generateed don't set nil to outlet varibles, only release them.)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
不,您不需要在
dealloc
中将 Outlet 设置为 nil。只要确保您释放了它们即可。nope, you don't need to set your outlets to nil in
dealloc
. Just make sure you are releasing them.