在调用respondsToSelector之前检查委托是否仍然存在

时间:2011-02-23 13:43:44

标签: iphone objective-c xcode ios

我已经制作了UIView子类来处理iAd和adMob。视图控制器是子类委托,一切正常。但有时,视图控制器会在获取广告之前消失。要解决此问题,我在视图控制器的delegate实施中将nil设置为dealloc

我遇到的问题是,有时respondsToSelector:方法在视图控制器被取消分配的同时运行。这会导致崩溃。有谁知道我如何重新排列这个?

广告视图位于大约10个不同的视图控制器上,所以我想要一个地方来创建广告代码。

非常感谢

7 个答案:

答案 0 :(得分:5)

一种简单的方法是保留视图,直到您有机会将委托设置为nil,然后释放它。然后,您可以确保对象仍然存在并防止崩溃。

答案 1 :(得分:5)

如果无法保留视图,则使用静态方法获取在dealloc中清除的实例。即:而不是:

if (delegate && [delegate respondsToSelector:@selector(...)])

这样做:

if (s_myViewDelegate && [delegate respondsToSelector:@selector(...)])

在课堂上:

- (id) init {
    s_myViewDelegate = self;
    ...etc...
}

- (void) dealloc {
    s_myViewDelegate = nil;
}

答案 2 :(得分:2)

if (delegate && [delegate respondsToSelector:@selector(...)])

答案 3 :(得分:2)

虽然这是一个很久以前的问题,但我真的搞砸了一下,终于发现了一些可能有用的东西。

为已完成或失败的事件设置completion block而不是委托,这会有所帮助。

答案 4 :(得分:0)

是的,这是iAd和admob的问题。我也遇到过这种问题。我已经通过在主窗口添加添加视图并将代理委托给app delegate来解决了这个问题,因此在您关闭应用程序之前,app delegate永远不会被释放。

答案 5 :(得分:-1)

您不应该有10个单独的广告视图,这在很多级别上都是错误的。相反,你应该只有一个你可以在个人观点之间移动,或者 - 更聪明 - 只需保持最佳状态。

例如,您可以向tabBarController.view添加视图,即使切换标签页也会保持不变。对于您不想要广告的视图,您只需隐藏它即可。

答案 6 :(得分:-1)

实际上有一个快速且不太好的解决方案 - 使用@ 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
}