gpt4 book ai didi

uiview - AdMob GADBannerView 在不应该发布和接收广告请求时未发布和接收广告请求

转载 作者:行者123 更新时间:2023-12-01 19:35:00 25 4
gpt4 key购买 nike

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

基本上我有 iAds 和 AdMob。我总是从 iAd 开始,如果广告没有可显示的内容,我会初始化 AdMob 并开始显示它。然后,当 iAds 最终显示某些内容时,我隐藏 Admob 广告并销毁 View 并再次显示 iAds。

这似乎适用于 1 次迭代含义:

  • 初始化 iAds
  • iAd 没有可显示的内容
  • 隐藏 iAds
  • 初始化 Admob
  • Admob 展示广告
  • iAds 收到了内容,所以我们应该显示它!
  • 隐藏 Admob
  • 释放 Admob View 对象

  • 问题是......随着时间的推移,如果我让应用程序运行并且 iAd 几次未能加载广告(这意味着我做了一些切换会导致创建 Admob View ),则发布的 Admob View 对象没有被释放并继续接收新的广告,即使它不应该。

    这是我从 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,因为:
  • 起初它是 == nil
  • 然后在 [self requestNewAdmobView] 我正在分配一个实例,所以保留计数 = 1
  • 我将其返回,然后将其添加到 viewControllers View 中, View 会保留它,从而使保留计数上升到 2
  • 然后我将释放 adMobView,因此我不再拥有它,并且保留下降到 1
  • 然后当我想在 [self shutdownAdmob] 中完全摆脱对象时,我使用 removeFromSupreview 函数从 Controller 释放 View ,因此它应该释放它(我什至通过子类化 GADViewController 并在释放时执行 NSLog 来测试它它确实dealloc)。

  • 唷..这是很多文字对不起。所以问题是:
    为什么 admobview 第一次正确地删除了自己,但在第二次时却没有。?

    最佳答案

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

    关于uiview - AdMob GADBannerView 在不应该发布和接收广告请求时未发布和接收广告请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5583642/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com