AdMob GADBannerView不会发布和接收广告请求

时间:2011-04-07 15:31:10

标签: uiview admob

这是我的问题。 另请注意,我不知道AdWhirl,但选择不使用它,因为我更愿意控制我的广告发生的事情。

基本上我有iAd和AdMob。我一开始就使用iAds,如果广告没有显示任何内容,我会初始化AdMob并开始显示它。然后,当iAds终于显示某些内容时,我会隐藏Admob广告并销毁视图并再次显示iAd。

这似乎适用于1次迭代,意思是:

  1. 初始化iAds
  2. iAds无内容展示
  3. 隐藏iAds
  4. 初始化Admob
  5. Admob展示广告
  6. iAds已收到内容,因此我们应该展示它!
  7. 隐藏Admob
  8. 发布Admob视图对象
  9. 问题是..随着时间的推移如果我让应用程序继续运行并且iAd无法加载广告几次(意味着我做了一些切换导致创建Admob视图),发布的Admob视图对象未被释放即使它不应该继续接收新广告。

    以下是我从iAds收到代码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];
            }
        }
    }
    

    这是[self 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;
    }
    

    这是[self reinitializeAdmob]功能:

    -(void) reinitializeAdmob
    {
        NSLog(@"AMOB :: reinitializeAdmob");
    
        if(theViewController != nil)
        {
            [self shutdownAdmob];
            adMobAd = nil;
            adMobAd = [self requestNewAdmobView];
    
            if(adMobAd!=nil)
            {
                [theViewController.view addSubview:adMobAd];
            }
        }
    }
    

    最后是[self 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");
        }
    }
    

    根据我的理解,我正在正确清理名为AdMobView的GADBannerView,因为:

    1. 起初是== nil
    2. 然后在[self requestNewAdmobView]中我正在分配一个实例,所以keep count = 1
    3. 我正在返回它,然后将其添加到viewControllers视图中,并且视图会保留它以使保留计数最多为2
    4. 然后我发布了adMobView,因此我不再拥有它,并且保留下降到1
    5. 然后当我想在[self shutdownAdmob]中完全摆脱对象时,我使用removeFromSupreview函数从控制器释放视图,因此它应该解除它(我甚至通过子类化GADViewController并执行NSLog来测试它在解除分配时确实是dealloc)。
    6. p p ..那是很多文本,对不起。所以问题是: 为什么admobview第一次正确地删除了自己,但是在第二次它没有出现时。?

2 个答案:

答案 0 :(得分:1)

您必须在shutdownAdMob中发布adMobAd。 removeFromSuperview减少了adMobAd的引用计数,但是 计数随addSubView递增,所以你必须释放它。

答案 1 :(得分:0)

我遇到了同样的问题。我选择了这个支票enter image description here

解决了这个问题