2011-02-23 148 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

相關問題