iAds: Как я могу предотвратить вызов моего делегата AdBannerView после того, как представление было выпущено? - PullRequest
0 голосов
/ 11 апреля 2011

Я добавляю iAds в свое приложение, и оно дает сбой, потому что делегат AdBannerView вызывается после выпуска представления.Я слежу за примерами кода в документации Apple, а также за примерами кода, которые я нашел на форумах Apple Dev, но я что-то упускаю, потому что происходит сбой.

Я создаю AdBannerView в viewDidLoad представления, который я хочу отобразить в ...

self.bannerIsVisible = NO;
self.adView = [[ADBannerView alloc] initWithFrame:CGRectMake(0, 0, 1024, 66)];
adView.requiredContentSizeIdentifiers = [NSSet setWithObject:ADBannerContentSizeIdentifierLandscape];
adView.currentContentSizeIdentifier = ADBannerContentSizeIdentifierLandscape;
adView.delegate = self;
[self.view addSubview:adView];

Я переношу его на фронт в viewDidAppear ...

[self.view bringSubviewToFront:[self adView]];
adView.frame = CGRectMake(0.0, 0.0, adView.frame.size.width, adView.frame.size.height);

Я устанавливаю значение nil в viewDidUnload ...

[[self adView] setDelegate:nil];
[self setAdView:nil];

и освобождаю его в dealloc ...

[adView release];

Тем не менее, время от времениприложение вылетает с этой ошибкой ...

-[MyViewController bannerView:didFailToReceiveAdWithError:]: message sent to deallocated instance 0xf61d820

Чего мне не хватает?

Большое спасибо за вашу мудрость!

1 Ответ

3 голосов
/ 11 апреля 2011

Возможно, что viewDidUnload никогда не будет вызвано, если контроллер представления завершает работу до того, как разгрузится представление. Вам также нужно будет установить делегат на nil в dealloc.


Кроме того, я заметил, что ваша память не правильно обрабатывает просмотр рекламы. Я подозреваю, что ваше adView свойство объявлено retain, а не assign. Если так, то после этой строки

self.adView = [[ADBannerView alloc] initWithFrame:CGRectMake(0, 0, 1024, 66)];

«удерживать счет» (не путать со свойством retainCount, которое следует игнорировать) рекламного баннера теперь два: один из alloc и один из присвоения свойству. Если он достигает viewDidUnload, то [self setAdView:nil] сбрасывает его один раз, но затем ссылка теряется, поэтому релиз в dealloc никогда не сможет снова его сбросить, чтобы «сохранить счет» обратно к нулю.

Если, с другой стороны, ваш adView фактически объявлен assign, а не retain, это все равно неправильно. В этом случае [self setAdView:nil] в viewDidUnload сбрасывает ссылку, даже не отпуская ее, пропуская просмотр рекламы.

...