我已经制作了UIView
子类来处理iAd和adMob。视图控制器是子类委托,一切正常。但有时,视图控制器会在获取广告之前消失。要解决此问题,我在视图控制器的delegate
实施中将nil
设置为dealloc
。
我遇到的问题是,有时respondsToSelector:
方法在视图控制器被取消分配的同时运行。这会导致崩溃。有谁知道我如何重新排列这个?
广告视图位于大约10个不同的视图控制器上,所以我想要一个地方来创建广告代码。
非常感谢
答案 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
}