在调用respondsToSelector之前检查委托是否仍然存在
我已经制作了UIView
子类来处理iAds和adMob。视图控制器是子类委托,一切正常。但是,有时候,视图控制器会在取出广告之前消失。为了解决这个问题,我在我的视图控制器的dealloc
实现中将delegate
设置为nil
。在调用respondsToSelector之前检查委托是否仍然存在
我遇到的问题是,有时respondsToSelector:
方法是在视图控制器被取消分配的同时运行。这会导致崩溃。有谁知道我可以重新排列这个?
广告视图位于大约10个不同的视图控制器上,因此我希望在一个位置创建广告代码。
非常感谢,直到你有机会来设置委托零,然后松开
一个简单的方法是保留看法。然后您可以确保该对象仍然存在,并防止崩溃。
if (delegate && [delegate respondsToSelector:@selector(...)])
即时通讯已经这样做,但:( – user609906 2011-02-23 15:08:41
这相当于'if([delegate respondsToSelector:@selector(...)])'',因为向nil发送消息返回0.检查'delegate == nil'是否不是有效的查看代理是否被释放的方法 – 2011-02-23 17:07:41
你不应该有10个人的广告观点,这是错误的这么多的水平。相反,你应该只有一个,你可以在单个视图之间移动,或者 - 更聪明 - 只要保持顶尖。
例如,您可以将视图添加到tabBarController.view,并且即使您切换选项卡,该视图也会保持存在状态。对于你不想看到广告的观点,你可以简单地隐藏它。
是的,这是iAd和admob的问题。我也有这样的问题。我已经通过在主窗口中添加视图解决了这个问题,并且委托给应用程序委托,所以在关闭应用程序之前,应用程序委托永远不会解除分配。
如果您不能保留该视图,则使用静态方法获取在dealloc中清除的实例。而不是:即
if (delegate && [delegate respondsToSelector:@selector(...)])
这样做:
if (s_myViewDelegate && [delegate respondsToSelector:@selector(...)])
在类:
- (id) init {
s_myViewDelegate = self;
...etc...
}
- (void) dealloc {
s_myViewDelegate = nil;
}
实际上有一个快速而不是很好的解决方案 - 使用@ try/@ catch块。只是,如果你到了@catch阻止你的委托失败是肯定的......这样的:
@try{
if (delegate && [delegate respondsToSelector:@selector(...)])
[delegate callBackMethod];
}
@catch (NSException *e){
// if you get here then delegate is no longer valid regardless its reference is still valid
}
你错了。 Try-catch块仅用于程序员错误:http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/ProgrammingWithObjectiveC/ErrorHandling/ErrorHandling.html%23//apple_ref/doc/uid/TP40011210 -CH9-SW3 – 2013-04-03 06:15:28
我在哪里错了?我会说“这不是很好的解决方案”。你是否想说这个解决方案相当好或什么?根本不是解决方案?好吧,试着找一个理想的世界/生活/男人等等。 – Stan 2016-06-23 12:34:33
增加:一个对象的委托应该总是生活不再那么本身(这是更高层次)。如果它被释放,它应该清理它的一团糟。它已经将自己设置为委托,所以它必须在代理释放时将委托设置回零。 – 2011-02-23 14:34:54