2011-02-23 135 views
5

我已经制作了UIView子类来处理iAds和adMob。视图控制器是子类委托,一切正常。但是,有时候,视图控制器会在取出广告之前消失。为了解决这个问题,我在我的视图控制器的dealloc实现中将delegate设置为nil在调用respondsToSelector之前检查委托是否仍然存在

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

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

非常感谢,直到你有机会来设置委托零,然后松开

回答

5

一个简单的方法是保留看法。然后您可以确保该对象仍然存在,并防止崩溃。

+2

增加:一个对象的委托应该总是生活不再那么本身(这是更高层次)。如果它被释放,它应该清理它的一团糟。它已经将自己设置为委托,所以它必须在代理释放时将委托设置回零。 – 2011-02-23 14:34:54

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

即时通讯已经这样做,但:( – user609906 2011-02-23 15:08:41

+4

这相当于'if([delegate respondsToSelector:@selector(...)])'',因为向nil发送消息返回0.检查'delegate == nil'是否不是有效的查看代理是否被释放的方法 – 2011-02-23 17:07:41

-1

你不应该有10个人的广告观点,这是错误的这么多的水平。相反,你应该只有一个,你可以在单个视图之间移动,或者 - 更聪明 - 只要保持顶尖。

例如,您可以将视图添加到tabBarController.view,并且即使您切换选项卡,该视图也会保持存在状态。对于你不想看到广告的观点,你可以简单地隐藏它。

0

是的,这是iAd和admob的问题。我也有这样的问题。我已经通过在主窗口中添加视图解决了这个问题,并且委托给应用程序委托,所以在关闭应用程序之前,应用程序委托永远不会解除分配。

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

虽然这是很久以前了,我真的是搞砸了一下,最后一个问题发现可能有所帮助的东西。

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

+0

不要忘记在完成块中使用'__weak'引用,否则可能会出现一些奇怪的错误。请记住,在块对象中捕获的任何变量在默认情况下都会保留! – 2012-03-27 02:10:47

+0

干杯!有用的提醒,我忘了使用_weak ... – BabyPanda 2012-03-27 04:22:39

+0

能够提供一些示例代码或指导?我有这个类似的委托问题,但我不知道如何开始使用完成块。谢谢! – Hexark 2014-07-25 14:36:26

-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 
} 
+3

你错了。 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

+0

我在哪里错了?我会说“这不是很好的解决方案”。你是否想说这个解决方案相当好或什么?根本不是解决方案?好吧,试着找一个理想的世界/生活/男人等等。 – Stan 2016-06-23 12:34:33

相关问题