我的iPhone应用程序中有2或3个视图,其中我有各种使用委托的功能。在所有情况下,委托都被分配到“self”,专门响应该视图的操作并与实例变量进行交互。
但是,如果我做了一些花了一些时间与一个委托,并离开视图,显然它会崩溃我的应用程序,因为委托方法在我离开的视图上被调用。
通常在我的委托方法中,我正在做的事情,比如与IBOutlets交互,调用其他实例方法,将数据保存到Core Data等......
我如何更好地与代表合作?我正在做什么典型的,不是吗?
感谢任何指导!
答案 0 :(得分:0)
取决于用例。例如,如果你有一个管理ViewController的UINavigationController,它使用像Location Services这样的东西,那么当你将View Controller从堆栈中弹出时,你就会想要将CLLocationManager的委托设置为nil。您可以在dealloc方法中执行此操作。
答案 1 :(得分:0)
您能举出一个您正面临的问题的具体示例吗?
在处理MapKit时遇到过这种情况(涉及委托回调和委托释放的竞争条件)。但是,总的来说,我认为当你的代表因竞争条件而失效时,这表明设计决定不好,但我可能是错的。
通常,使用您的委托的对象应该存在于委托本身的上下文中。因此,例如,包含要使用委托回调管理的各种IBOutlet
的同一个类也应该是这些IBOutlet
的委托。这样,当类(即代理)被释放时,IBOutlet
s(希望)也被解除分配,因此它们不会对任何内容进行回调。
bpapa是对的。更一般地说,如果你有一个可能冗长的委托回调,要么确保1)委托是一个在委托者生命周期内不会被释放的对象(例如,UINavigationController
管理UIViewController
s )或2)委托人的delegate
对象在委托释放期间设置为nil。
......最后一句话是满口的。 :)
答案 2 :(得分:0)
您的代表应该被宣布为
@property (nonatomic, assign) id <MyDelegateProtocol> delegate;
这确保了一个弱引用,这样当你释放具有delegate
的对象时,它只删除引用而不是相应的对象。使用(strong)
将导致dealloc崩溃。
致电您的代表时,您可以查看
if (self.delegate && [self.delegate respondsToSelector:@selector(MyDelegateProtocolCallbackMethodName:)] {
[self.delegate MyDelegateProtocolCallbackMethodName:result];]
}
一般来说,我使用代理类代理类来从服务器获取数据或编辑屏幕,例如更改待办事项列表中的任务标题或编辑数据库中的模型。
委托的优势是一个非常明确的用例。如果您发现应用程序的多个部分需要知道事件发生的时间(在1个屏幕上触发但在另一个屏幕上可能会被侦听),我建议使用NSNotificationCenter
来引发通知,而不是或者除此之外向您的代表发送消息。