2011-04-11 23 views
0

我將iAds添加到我的應用程序中,因爲AdBannerView委託在視圖發佈後被調用,所以它崩潰了。我正在關注Apple文檔中的代碼示例以及我在Apple Dev論壇上找到的代碼示例,但我錯過了某些內容,因爲它正在崩潰。iAds:如何防止我的AdBannerView委託在視圖發佈後被調用?

我創造我想要顯示它在視圖中的viewDidLoad中的AdBannerView ...

self.bannerIsVisible = NO; 
self.adView = [[ADBannerView alloc] initWithFrame:CGRectMake(0, 0, 1024, 66)]; 
adView.requiredContentSizeIdentifiers = [NSSet setWithObject:ADBannerContentSizeIdentifierLandscape]; 
adView.currentContentSizeIdentifier = ADBannerContentSizeIdentifierLandscape; 
adView.delegate = self; 
[self.view addSubview:adView]; 

我把它在viewDidAppear前...

[self.view bringSubviewToFront:[self adView]]; 
adView.frame = CGRectMake(0.0, 0.0, adView.frame.size.width, adView.frame.size.height); 

我設置它在viewDidUnload零...

[[self adView] setDelegate:nil]; 
[self setAdView:nil]; 

,我釋放它的dealloc中...

[adView release]; 

然而,每一個現在,然後,應用程序崩潰與此錯誤...

-[MyViewController bannerView:didFailToReceiveAdWithError:]: message sent to deallocated instance 0xf61d820 

我缺少什麼?

非常感謝你的智慧!

回答

3

如果在卸載視圖之前視圖控制器被釋放,則可能不會調用viewDidUnload。你也需要在dealloc中設置委託爲零。


另外,我注意到您對廣告視圖的內存處理是錯誤的。我懷疑你的adView財產被宣佈爲retain而不是assign。如果是這樣,那麼這行後

self.adView = [[ADBannerView alloc] initWithFrame:CGRectMake(0, 0, 1024, 66)]; 

的「保留計數」的廣告橫幅(不要與retainCount屬性,它應該被忽略混淆)現已有二:一個是從alloc和一個從轉讓給財產。如果它達到viewDidUnload,則[self setAdView:nil]會釋放一次,但隨後引用將丟失,因此dealloc中的發佈無法再次釋放它,以使「保留計數」回到零。

另一方面,如果您的adView實際上被宣佈爲assign而不是retain,它仍然是錯誤的。在這種情況下,viewDidUnload中的[self setAdView:nil]會放棄參考,但不會釋放它,從而泄漏廣告視圖。

+0

謝謝,失戀,抓住那個。我只是修復了它,到目前爲止崩潰並沒有發生,但它始終是間歇性的,所以如果它仍在發生,我會告訴你。再次感謝! – BeachRunnerFred 2011-04-11 03:12:59

+0

我認爲修好了! – BeachRunnerFred 2011-04-11 03:24:16

相關問題