AdMob GADBannerView не выпускает и не получает рекламные запросы, когда это не должно - PullRequest
3 голосов
/ 07 апреля 2011

Вот моя проблема. Также, пожалуйста, помните, что я не знаю об AdWhirl, но предпочитаю не использовать его, потому что предпочитаю контролировать то, что происходит с моей рекламой.

В основном у меня есть iAds и AdMob. Я всегда начинаю с iAds, и если в объявлениях нечего показывать, я инициализирую AdMob и начинаю его показывать. Затем, когда iAds наконец-то получает что-то для показа, я скрываю рекламу Admob, уничтожаю вид и снова показываю iAds.

Кажется, это работает для 1 итерации, что означает:

  1. инициализировать iAds
  2. iAds не имеет контента для показа
  3. скрыть iAds
  4. инициализировать Admob
  5. Admob показывает рекламу
  6. iAds получил контент, поэтому мы должны отобразить его!
  7. скрыть Admob
  8. освободить объект просмотра Admob

Проблема в том, что ... со временем, если я оставляю приложение запущенным, а iAd не может загрузить объявления несколько раз (то есть, я немного переключаюсь, что приводит к созданию представлений Admob), освобожденный объект представления Admob не освобождается и продолжает получать новые объявления, даже если это не так.

Вот код, который я запускаю всякий раз, когда получаю код 3 от iAds (то есть: операция не может быть завершена. Рекламный инвентарь недоступен)

-(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");
    }
}

Теперь, насколько я понимаю, я правильно очищаю GADBannerView, называемый AdMobView, потому что:

  1. сначала это == ноль
  2. затем в [self requestNewAdmobView] я выделяю экземпляр, так что оставьте count = 1
  3. Я возвращаю его, а затем добавляю в представление viewControllers, и представление сохраняет его, так что количество сохранений увеличивается до 2
  4. Затем я выпускаю adMobView, поэтому я больше не владею им, и срок хранения падает до 1
  5. затем, когда я хочу полностью избавиться от объекта в [self shutdownAdmob], я использую функцию removeFromSupreview, которая освобождает представление от контроллера, и, следовательно, оно должно освободить его (я даже протестировал это, создав подкласс GADViewController и выполнив NSLog после освобождения, и это действительно делает освобождение).

Уф .. Это много текста, извините за это. Итак, вопрос: почему admobview удаляет себя правильно в первый раз, а во второй раз - нет .?

Ответы [ 2 ]

1 голос
/ 15 апреля 2011

Вы должны освободить adMobAd в shutdownAdMob.RemoveFromSuperview уменьшает счетчик ссылок adMobAd, но счетчик был увеличен с помощью addSubView, поэтому вы должны освободить его.

0 голосов
/ 01 апреля 2018

У меня была такая же проблема.Я решил, выбрав этот чек enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...