0

我正在制作一个有点像 iBooks 的应用程序。屏幕上有一些东西,每个项目都由一个小缩略图表示。我希望用户能够像点击 iBooks 中的“编辑”按钮时一样删除项目 - 出现 X,项目被删除。我正在使用委托模式来处理所有这些,所以这里有一些代码:

// Button is created in CustomView.h class
UIImage *deleteImage = [UIImage imageNamed:@"delete.png"];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
self.deleteButton = button;
[self.deleteButton setImage:deleteImage forState:UIControlStateNormal]; 
[self.deleteButton addTarget:self action:@selector(deleteIt) forControlEvents:UIControlEventTouchUpInside];

// Here's what's called when the delete button is pushed
- (IBAction)deleteMap {
[self.customViewDelegate itemWasDeleted:self];  
}

// And here's the implementation of that method, in a View Controller
- (void)itemWasDeleted:self:(CustomView*)customView {
    // delete domain object
    // . . .    

    [self.collectionOfCustomViews removeObject:customView];
    [customView removeFromSuperview];
}

这段代码的问题是我得到了一个错误的访问异常。通过 NSZombie,看起来像这样:

* -[UIButton _unhighlight]:消息发送到释放的实例 0x5f4a740

我猜发生的事情是,当我的目标操作实现被调用时,释放按钮还不安全,就像我在委托方法中所做的那样。所以我的问题是,有什么更好的方法来做到这一点,这样应用程序就不会崩溃?我想知道最干净的方法。

4

1 回答 1

1

如果 collectionOfCustomViews 是唯一保留 customView 的对象,那么您在删除它时释放了它,因此它无法响应 removeFromSuperview。

于 2010-10-06T19:03:34.243 回答