iPhone开发 - 代理,通知,取消分配之前取消订阅?

mk1*_*k12 5 iphone events cocoa-touch delegates objective-c

在我关于使用委托或UIControl事件的问题中,这是在Kendall Helmstetter Geln的回答中:

两者都是一个相同的负载 - 与代表你必须自己设置,然后记得在你被解除分配之前取消自己.你必须对通知做同样的事情,记得开始听,然后在你被解除分配之前取消订阅.

他们是什么意思,在取消分配之前取消订阅,取消自己的设定?我没有做过任何事情.有人可以解释它是什么以及如何做到这一点?

谢谢!!

Rob*_*ier 8

如果您的生命周期短于您所委托的对象,则需要将自己移除为委托.几乎在所有情况下,您的生命周期都等于或长于您所委托的对象.这就是说,这是一个很好的习惯.考虑您是UITableView的委托的情况.在-init,也许你打电话:

self.myTableView.delegate = self;
Run Code Online (Sandbox Code Playgroud)

然后,它可能会是明智-dealloc的说

_myTableView.delegate = nil;
[_myTableView release];
_myTableView = nil;
Run Code Online (Sandbox Code Playgroud)

这样做的原因是myTableView可能被其他对象保留,因此在释放它时可能不会释放.如果它在您离开后进行委托调用,您的应用程序将崩溃.所以清除委托指针在这里是一个好主意.

类似地,对于NSNotificationCenter,您应该删除自己-dealloc:

[[NSNotificationCenter defaultCenter] removeObserver:self];
Run Code Online (Sandbox Code Playgroud)

这使您无法进行所有观察.如果您的类曾注册任何通知,则应在-dealloc中执行此操作.如果你不这样做,并且在你离开后进入你正在观察的通知,应用程序将崩溃.

这对于NSTimers来说不是必需的,因为NSTimers保留了他们的目标(你).