Iphone iAds:如何防止我的AdBannerView代理在视图发布后被调用?

Iphone iAds:如何防止我的AdBannerView代理在视图发布后被调用?,iphone,ios,ipad,iad,Iphone,Ios,Ipad,Iad,我正在将iAds添加到我的应用程序中,它正在崩溃,因为AdBannerView代理在视图发布后被调用。我正在关注Apple文档中的代码示例,以及在Apple Dev论坛上找到的代码示例,但我遗漏了一些东西,因为它正在崩溃 我在视图中创建AdBannerView加载我要在中显示的视图 self.bannerIsVisible = NO; self.adView = [[ADBannerView alloc] initWithFrame:CGRectMake(0, 0, 1024, 66)]; ad

我正在将iAds添加到我的应用程序中,它正在崩溃,因为AdBannerView代理在视图发布后被调用。我正在关注Apple文档中的代码示例,以及在Apple Dev论坛上找到的代码示例,但我遗漏了一些东西,因为它正在崩溃

我在视图中创建AdBannerView加载我要在中显示的视图

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];
我把它带到前面的视图中出现

[self.view bringSubviewToFront:[self adView]];
adView.frame = CGRectMake(0.0, 0.0, adView.frame.size.width, adView.frame.size.height);
我在viewDidUnload中将其设置为零

[[self adView] setDelegate:nil];
[self setAdView:nil];
我在dealloc中发布它

[adView release];
然而,偶尔,应用程序会因为这个错误而崩溃

-[MyViewController bannerView:didFailToReceiveAdWithError:]: message sent to deallocated instance 0xf61d820
我错过了什么


非常感谢你的智慧

如果视图控制器在卸载视图之前被释放,则可能永远不会调用
viewDidUnload
。您还需要在dealloc中将委托设置为nil


另外,我注意到您对广告视图的内存处理是错误的。我怀疑您的
adView
属性声明为
retain
,而不是
assign
。如果是,那么在这一行之后

self.adView = [[ADBannerView alloc] initWithFrame:CGRectMake(0, 0, 1024, 66)];
广告横幅的“保留计数”(不要与
retainCount
属性混淆,应该忽略)现在有两个:一个来自alloc,一个来自属性赋值。如果它到达
viewDidUnload
,则
[self-setAdView:nil]
将其释放一次,但随后引用丢失,因此
dealloc
中的释放将无法再次释放它以使“保留计数”恢复为零


另一方面,如果您的
adView
实际上被声明为
assign
,而不是
retain
,那么它仍然是错误的。在这种情况下,
viewDidUnload
中的
[self-setAdView:nil]
会在从未释放引用的情况下删除引用,从而泄漏ad视图。

如果在卸载视图之前释放了视图控制器,则可能永远不会调用
viewDidUnload
。您还需要在dealloc中将委托设置为nil


另外,我注意到您对广告视图的内存处理是错误的。我怀疑您的
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]
会在不释放引用的情况下删除引用,从而泄漏广告视图。

感谢Anomie,您捕捉到了这一点。我刚把它修好,到目前为止还没有发生坠机,但一开始它是间歇性的,所以我会让你知道它是否还在发生。再次感谢!谢谢你,Anomie,谢谢你抓住了这个机会。我刚把它修好,到目前为止还没有发生坠机,但一开始它是间歇性的,所以我会让你知道它是否还在发生。再次感谢!