修改: 自己解决了这个问题。原来这是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;
答案 0 :(得分:1)
如果早期的评论没有解决这个问题,也许这可能有所帮助我假设你已经像这样创建了someViewController属性
@property (nonatomic, retain) NSViewController* someViewController;
在这种情况下,我相信你的代码是正确的(至少我可以看到它应该如何工作),你可能会看到这里的二次崩溃。
即。当你打电话时
self.someViewController = nil;
这应该立即释放内存(假设一个帧已经消失了VC,因此自动释放的计数已经减少)。因此,如果您在someViewController VC中使用了另一个对象,该对象仍然存在并且将一个委托设置为someViewController对象并且正在执行后台任务,那么当它试图回调到您现在解除分配的对象时会导致崩溃。 (如果你没有释放你的VC,你就不会看到这个崩溃)
例如,如果你有一个MKMapKit显示在someViewController中,并且委托设置为someViewController ......如果你已经在someViewController中实现了该方法
mapViewDidFinishLoadingMap:(MKMapView*)mapView
如果你之前没有销毁MKMapView对象,那么MKMapKit可能仍在从另一个线程调用它。
我总是将指向你的VC(如MKMapView)的其他对象委托设置为nil,然后销毁它用来避免这种风险的VC。对于PDF渲染(CALayer?),您可能会发现需要显式释放该对象,因为它使用了不同的内存alloc / free范例。
答案 1 :(得分:0)
自己解决了这个问题。原来它是dealloc方法的一个遗留物导致UIButton被释放两次......