Как можно безопасно управлять памятью кнопкой, которую я хочу удалить из пользовательского интерфейса? - PullRequest
0 голосов
/ 06 октября 2010

Я делаю приложение, похожее на 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];
}

Проблема с этим кодом в том, что я получил исключение Bad Access Exception.Через NSZombie выглядит так:

* - [UIButton _unhighlight]: сообщение отправлено на освобожденный экземпляр 0x5f4a740

Я думаю, что происходиткогда вызывается моя реализация target-action, отпустить кнопку еще не безопасно, как я делаю в моем методе делегата.Итак, мой вопрос: как лучше подойти к этому, чтобы приложение не зависало?Я хотел бы знать самый чистый подход, возможный.

1 Ответ

1 голос
/ 06 октября 2010

Если collectionOfCustomViews был единственным объектом, сохранившим customView, вы освобождали его при удалении, поэтому он не может отвечать на removeFromSuperview.

...