2011-04-07 60 views
2

這是我的問題。 也請不要說我知道AdWhirl,但選擇不使用它,因爲我更喜歡控制我的廣告正在發生的事情。AdMob GADBannerView在不應該發佈和接收廣告請求時

基本上我有iAds和AdMob。我始終開始使用iAds,如果廣告沒有任何顯示,我會初始化AdMob並開始顯示它。然後,當iAds最終顯示某些內容時,我會隱藏Admob廣告並摧毀視圖並再次顯示iAds。

這似乎爲1個迭代意義的工作:

  1. 初始化網絡成癮
  2. 成癮者沒有任何內容顯示
  3. 隱藏的iAds
  4. 初始化AdMob聯播
  5. AdMob聯播顯示廣告
  6. iAds已收到內容,所以我們應該顯示它!
  7. 隱藏AdMob聯播
  8. 釋放AdMob中查看的對象

的問題是..隨着時間的推移,如果我離開應用程序運行和iAd的失敗幾次加載廣告(意爲我做切換的一個位,該位導致創建Admob視圖)發佈的Admob視圖對象沒有被釋放,並且不斷收到新的廣告,即使它不應該。

這裏是我跑每當我接收來自網絡成癮者的碼3的代碼(這意味着:該操作不能完成的廣告資源不可用)

-(void) smartInitialize:(UIViewController*) theVC 
{ 
    NSLog(@"AMOB :: smartInitialize"); 

    if(!initialized) 
    { 
     NSLog(@"AMOB :: PRE initialization"); 
     CGRect appFrame = [UIScreen mainScreen].applicationFrame; 
     UIView * theView = [[UIView alloc] initWithFrame:appFrame]; 
     theView.autoresizingMask = UIViewAutoresizingFlexibleHeight; 
     theViewController = theVC; 
     //[theViewController retain]; 
     self.view = theView; 
     [theView release]; 
     adMobAd = nil; 
     adMobAd = [self requestNewAdmobView]; 
     if(adMobAd != nil) 
     { 
      NSLog(@"AMOB :: adding ADMOBVIEW TO VIEW CONTROLLER!"); 
      [theVC.view addSubview:adMobAd]; 
      [adMobAd release]; 
     } 

     initialized = YES; 
    } 
    else 
    { 
     NSLog(@"AMOB :: POST initialization"); 

     if(adMobAd!=nil) 
     { 
      NSLog(@"AMOB :: adMobView is present, doing nothing..."); 
     } 
     else 
     { 
      NSLog(@"AMOB :: reinitializing.."); 
      [self reinitializeAdmob]; 
     } 
    } 
} 

這裏是[自requestNewAdmobView]函數:

- (GADBannerView*) requestNewAdmobView 
{ 
    NSLog(@"AMOB :: requestNewAdmobView"); 
    CGRect adFrame = CGRectZero; 
    NSString * appID = nil; 
    adMobAd = nil; 

    if(DEVICE_IPAD) 
    { 
     adFrame.size = GAD_SIZE_728x90; 
     appID = @"id1"; 
    } 
    else 
    { 
     adFrame.size = GAD_SIZE_320x50; 
     appID = @"id2"; 
    } 

    GADBannerView * tmp = nil; 
    tmp = [[GADBannerView alloc] initWithFrame:adFrame]; 

    if(tmp != nil) 
    { 
     NSLog(@"AMOB :: adMobAD != nil , commencing with other stuff!"); 
     tmp.adUnitID = appID; 
     tmp.rootViewController = gD.viewController; 
     tmp.delegate = self; 
     [tmp loadRequest:[GADRequest request]]; 
     [tmp setHidden:NO]; 
    } 
    else 
    { 
     NSLog(@"AMOB :: adMobAD == nil , THIS IS BAD.."); 
    } 

    return tmp; 
} 

這裏是[自reinitializeAdmob]函數:

-(void) reinitializeAdmob 
{ 
    NSLog(@"AMOB :: reinitializeAdmob"); 

    if(theViewController != nil) 
    { 
     [self shutdownAdmob]; 
     adMobAd = nil; 
     adMobAd = [self requestNewAdmobView]; 

     if(adMobAd!=nil) 
     { 
      [theViewController.view addSubview:adMobAd]; 
     } 
    } 
} 

最後的[自shutdownAdmob]

-(void) shutdownAdmob 
{ 
    NSLog(@"AMOB :: shutdownAdmob"); 

    if(adMobAd!=nil) 
    { 
     NSLog(@"AMOB :: adMobAd != nil, removing from superview and nilling..."); 
     adMobAd.delegate = nil; 
     [adMobAd removeFromSuperview]; 
     //[adMobAd release]; 
     adMobAd = nil; 
    } 
    else 
    { 
     NSLog(@"AMOB :: adMobAd == nil"); 
    } 
} 
從我的理解,我打掃的GADBannerView

既然叫AdMobView正確,因爲:

  1. 首先是==零
  2. 然後在[自requestNewAdmobView ]我正在分配一個實例,所以保留計數= 1
  3. 我回來了,然後將其添加到viewControllers視圖和視圖保留它,使保留計數增加到2
  4. 我然後發佈adMobView,所以我不再擁有它,並保留下降到1
  5. 然後,當我想完全擺脫在[self shutdownAdmob]中的對象我使用removeFromSupreview函數釋放視圖從控制器,因此它應該釋放它(我甚至通過繼承GADViewController來進行測試,並在釋放時執行NSLog並確實執行dealloc)。

唷..這是很多文字對不起。所以問題是: 爲什麼admobview第一次正確移除自己,但第二次移除它卻沒有。

回答

1

您必須在shutdownAdMob中釋放adMobAd。 removeFromSuperview會減少adMobAd的引用計數,但 計數會使用addSubView增加,因此您必須將其釋放。

相關問題