Вот моя проблема.
Также, пожалуйста, помните, что я не знаю об AdWhirl, но предпочитаю не использовать его, потому что предпочитаю контролировать то, что происходит с моей рекламой.
В основном у меня есть iAds и AdMob. Я всегда начинаю с iAds, и если в объявлениях нечего показывать, я инициализирую AdMob и начинаю его показывать. Затем, когда iAds наконец-то получает что-то для показа, я скрываю рекламу Admob, уничтожаю вид и снова показываю iAds.
Кажется, это работает для 1 итерации, что означает:
- инициализировать iAds
- iAds не имеет контента для показа
- скрыть iAds
- инициализировать Admob
- Admob показывает рекламу
- iAds получил контент, поэтому мы должны отобразить его!
- скрыть Admob
- освободить объект просмотра 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, потому что:
- сначала это == ноль
- затем в [self requestNewAdmobView] я выделяю экземпляр, так что оставьте count = 1
- Я возвращаю его, а затем добавляю в представление viewControllers, и представление сохраняет его, так что количество сохранений увеличивается до 2
- Затем я выпускаю adMobView, поэтому я больше не владею им, и срок хранения падает до 1
- затем, когда я хочу полностью избавиться от объекта в [self shutdownAdmob], я использую функцию removeFromSupreview, которая освобождает представление от контроллера, и, следовательно, оно должно освободить его (я даже протестировал это, создав подкласс GADViewController и выполнив NSLog после освобождения, и это действительно делает освобождение).
Уф .. Это много текста, извините за это. Итак, вопрос:
почему admobview удаляет себя правильно в первый раз, а во второй раз - нет .?