Uiview AdMob GadbanerView在不应发布和接收广告请求时不发布和接收广告请求';T

Uiview AdMob GadbanerView在不应发布和接收广告请求时不发布和接收广告请求';T,uiview,admob,Uiview,Admob,这是我的问题。 另外,请不要因为我知道AdWhirl,而选择不使用它,因为我更喜欢控制我的广告发生了什么 基本上我有iAds和AdMob。我总是从IAD开始,如果广告没有什么可显示的,我初始化AdMob并开始显示它。然后,当iAds最终得到一些东西显示时,我隐藏Admob广告并破坏视图,再次显示iAds 这似乎适用于1次迭代,即: 初始化iAds IAD没有内容可展示 隐藏iAds 初始化Admob Admob显示广告 IAD已经收到内容,所以我们应该显示它 隐藏Admob 释放Admob视图

这是我的问题。 另外,请不要因为我知道AdWhirl,而选择不使用它,因为我更喜欢控制我的广告发生了什么

基本上我有iAds和AdMob。我总是从IAD开始,如果广告没有什么可显示的,我初始化AdMob并开始显示它。然后,当iAds最终得到一些东西显示时,我隐藏Admob广告并破坏视图,再次显示iAds

这似乎适用于1次迭代,即:

  • 初始化iAds
  • IAD没有内容可展示
  • 隐藏iAds
  • 初始化Admob
  • Admob显示广告
  • IAD已经收到内容,所以我们应该显示它
  • 隐藏Admob
  • 释放Admob视图对象
  • 问题是。。随着时间的推移,如果我让应用程序继续运行,而iAd几次未能加载广告(这意味着我会进行一些切换,从而创建Admob视图),则发布的Admob视图对象不会被发布,并且会不断接收新广告,即使它不应该被发布

    以下是每当我从iAds收到代码3时运行的代码(意思是:操作无法完成。Ad库存不可用)

    以下是[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;
    }
    
    -(void) reinitializeAdmob
    {
        NSLog(@"AMOB :: reinitializeAdmob");
    
        if(theViewController != nil)
        {
            [self shutdownAdmob];
            adMobAd = nil;
            adMobAd = [self requestNewAdmobView];
    
            if(adMobAd!=nil)
            {
                [theViewController.view addSubview:adMobAd];
            }
        }
    }
    
    以下是[self reinitializeAdmob]函数:

    - (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;
    }
    
    -(void) reinitializeAdmob
    {
        NSLog(@"AMOB :: reinitializeAdmob");
    
        if(theViewController != nil)
        {
            [self shutdownAdmob];
            adMobAd = nil;
            adMobAd = [self requestNewAdmobView];
    
            if(adMobAd!=nil)
            {
                [theViewController.view addSubview:adMobAd];
            }
        }
    }
    
    最后是[自动关闭AdMob]

    -(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的GadbanerView,因为:

  • 起初它是==零
  • 然后在[self-requestNewAdmobView]中分配一个实例,以便retain count=1
  • 我返回它,然后将其添加到viewControllers视图中,视图将保留它,从而使保留计数上升到2
  • 然后,我将释放adMobView,因此我不再拥有它,并且保留值将下降到1
  • 然后,当我想在[self shutdownAdmob]中完全删除对象时,我使用RemoveFromSuperView函数,该函数从控制器中释放视图,因此它应该解除锁定(我甚至通过将GADViewController子类化并在解除锁定时执行NSLog进行了测试,它确实解除锁定)
  • 呸。。太多了,抱歉。因此,问题是:
    为什么admobview在第一次正确卸下,但在第二次时却没有正确卸下?

    您必须在shutdownAdMob中释放adMobAd。 removeFromSuperview会减少adMobAd的引用计数,但
    计数随着addSubView的增加而增加,因此您必须释放它。

    我也遇到了同样的问题。我通过选择这张支票解决了这个问题