【问题标题】:addSubview of UIViewController, view gets over releasedUIViewController 的 addSubview,视图被释放
【发布时间】:2011-02-11 11:26:55
【问题描述】:

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

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

[CALayer release]:消息发送到释放的实例 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;

【问题讨论】:

  • someViewController的声明是什么?
  • re: robin => 他正在分配一个属性。如果属性是retain(或copy),他需要autorelease。
  • [self.view addSubview:someViewController.view];像这样给出而不是 [self.view addSubview:self.someViewController.view];
  • 并且也给出这样的:[someViewController.view removeFromSuperview];希望对你有帮助..

标签: iphone uiviewcontroller addsubview


【解决方案1】:

如果早期的 cmets 不能解决这个问题,也许这可能会有所帮助。我假设你已经像这样创建了你的 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?),您可能会发现您也需要显式释放对象,因为它使用不同的内存分配/释放范式。

【讨论】:

  • 我已经检查了 someViewController 并确保 dealloc 中的所有其他对象委托都设置为 nil。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2018-08-27
    • 1970-01-01
    相关资源
    最近更新 更多