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

use*_*906 5 iphone xcode objective-c ios

我已经创建了一个UIView子类来处理iAds和adMob.视图控制器是子类委托,一切正常.但有时,视图控制器会在获取广告之前消失.为了解决这个问题,我在视图控制器的实现中设置了delegateto .nildealloc

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

广告视图位于大约10个不同的视图控制器上,因此我希望有一个位置来创建广告代码.

非常感谢

fut*_*te7 5

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

  • 增加:一个对象的委托应该总是比它自己更长寿(它在层次结构中更高).如果它被解除分配,它应该清理它的混乱.它已将自己设置为委托,因此在取消分配时必须将委托设置为nil. (2认同)

Mat*_*lly 5

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

if (delegate && [delegate respondsToSelector:@selector(...)])
Run Code Online (Sandbox Code Playgroud)

做这个:

if (s_myViewDelegate && [delegate respondsToSelector:@selector(...)])
Run Code Online (Sandbox Code Playgroud)

在课堂里:

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

- (void) dealloc {
    s_myViewDelegate = nil;
}
Run Code Online (Sandbox Code Playgroud)