0

编辑:自己解决了这个问题。原来这是 dealloc 方法中的一个剩余部分,导致 UIButton 被释放两次......

我正在尝试在另一个 UIViewController 之上显示一个 UIViewController,例如弹出窗口。问题是视图似乎被过度发布了。使用 NSZombieEnabled,我收到以下错误:

[CALayer 发布]:消息发送到已释放实例 0x784bf40

我使用此代码添加视图:

//self.someViewController is declared as (nonatomic, retain)
self.someViewController = [[[SomeViewController alloc] initWithDelegate:self] autorelease];
[self.view addSubview:self.someViewController.view];

然后稍后,我删除这样的视图:

[self.someViewController.view removeFromSuperview];
self.someViewController = nil;
4

2 回答 2

1

如果早期的评论不能解决这个问题,也许这可能会有所帮助。我假设你已经像这样创建了你的 someViewController 属性

@property (nonatomic, retain) NSViewController* someViewController;

在这种情况下,我相信您的代码是正确的(至少我可以看到它应该如何工作)并且您可能会在这里看到二次崩溃。

即当你打电话时

self.someViewController = nil;

这应该立即释放内存(假设一帧已经经过 VC 所在的位置,因此自动释放的计数已经减少)。因此,如果您在 someViewController VC 中使用了另一个对象,该对象仍然存在并且为您的 someViewController 对象设置了一个委托并且正在执行后台任务,那么当它尝试回调您现在已释放的对象时将导致崩溃。(如果你不释放你的 VC,你就不会看到这个崩溃)

例如,如果您在 someViewController 中显示 MKMapKit,并且委托设置为 someViewController... 如果您在 someViewController 中实现了该方法

mapViewDidFinishLoadingMap:(MKMapView*)mapView

如果您之前没有销毁 MKMapView 对象,MKMapKit 可能仍会从另一个线程调用它。

在销毁它用来避免这种风险的所述 VC 之前,我总是将指向您的 VC(如 MKMapView)的其他对象委托设置为 nil。对于 PDF 渲染(CALayer?),您可能会发现您也需要显式释放对象,因为这使用了不同的内存分配/释放范式。

于 2011-02-11T12:04:03.097 回答
0

自己解决了这个问题。原来这是 dealloc 方法中的一个剩余部分,导致 UIButton 被释放两次......

于 2011-02-11T15:57:26.380 回答