Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone开发人员-代理、通知、取消分配前取消订阅?_Iphone_Objective C_Cocoa Touch_Events_Delegates - Fatal编程技术网

iPhone开发人员-代理、通知、取消分配前取消订阅?

iPhone开发人员-代理、通知、取消分配前取消订阅?,iphone,objective-c,cocoa-touch,events,delegates,Iphone,Objective C,Cocoa Touch,Events,Delegates,在我关于使用代表或UIControl事件的问题中,这是Kendall Helmstetter Geln的回答: 这两种方法的工作量都差不多——对于一个委托,你必须自己设置,然后记得在解除分配之前先取消设置。你必须对通知做同样的事情,记住开始监听,然后在取消分配之前取消订阅 什么意思,在交易前退订,取消你自己?我没有做任何事情。有人能解释一下这是什么以及怎么做吗 谢谢 我相信您只是简单地将委托设置为零 myOjectOrClass.delegate = nil; 如果您的生命周期短于您作为代理

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

这两种方法的工作量都差不多——对于一个委托,你必须自己设置,然后记得在解除分配之前先取消设置。你必须对通知做同样的事情,记住开始监听,然后在取消分配之前取消订阅

什么意思,在交易前退订,取消你自己?我没有做任何事情。有人能解释一下这是什么以及怎么做吗


谢谢

我相信您只是简单地将委托设置为零

myOjectOrClass.delegate = nil; 

如果您的生命周期短于您作为代理的对象,则需要删除您作为代理的身份。在几乎所有情况下,您的使用寿命都等于或长于要为其委派的对象。也就是说,这是一个好习惯。考虑您是UITababVIEW的委托的情况。在
-init
中,您可能会调用:

self.myTableView.delegate = self;
那么在
-dealoc
中说

_myTableView.delegate = nil;
[_myTableView release];
_myTableView = nil;
这样做的原因是myTableView可能会被其他对象保留,因此在释放它时可能不会解除分配。如果它在您离开后进行委托调用,您的应用程序将崩溃。因此,在这里清除委托指针是一个好主意

同样,对于NSNotificationCenter,您应该在
-dealloc
中删除自己,因此:

[[NSNotificationCenter defaultCenter] removeObserver:self];
这会将您从所有观察中移除。如果您的类注册了任何通知,您应该在-dealloc中执行此操作。如果你不这样做,并且在你离开后收到一个通知,应用程序将崩溃


这对于NSTimer不是必需的,因为NSTimer保留其目标(您)。

当传递到UIControl addTarget方法时,不会对目标执行保留。尽管文档中没有具体提到这一点,但我已经编写了一个简单的测试来证明这一点

如果您添加一个目标作为控件事件的观察者,然后释放它,您将注意到保留计数下降(可能导致它被回收)


这意味着控件永远不会阻止目标被解除分配

,因此您必须为分配的每个代理执行此操作?如果你不这样做会发生什么?关于事件(使用[control addTarget:self action:..)呢?为什么在我的书和示例代码中我从来没有看到过这一点?我们在调用release之前将委托设置为nil。谢谢!那么UIControl事件呢?我应该执行[myButton removeTarget:..]?这是否也适用于数据源?对于UIControl,这是一个有趣的问题。我不确定addTarget:…是否保留。如果不保留,则您是对的,您可能应该删除自己。数据源与代理相同。其他人是否确实知道UIControl事件?