ошибка super dealloc EXC_BAD_ACCESS - PullRequest
       1

ошибка super dealloc EXC_BAD_ACCESS

2 голосов
/ 02 августа 2011

При анализе нашего проекта Xcode поставлялся с уведомлением об утечке в пользовательском UIBarButtonItem. Я исправил утечку, но при загрузке представления во второй раз [super dealloc] выдает ошибку EXC_BAD_ACCESS.

Удаление авто-релиза из UIBarButtonItem (поэтому возвращает предупреждение):

self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:toolbar] autorelease];

не вызывает проблем при перезагрузке экрана.

Пользовательский код UIBarButtonItem и код сделки:

- (void)viewDidLoad
{
    [super viewDidLoad];

    // create a toolbar to have the buttons at the right side of the navigationBar
    UIToolbar* toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 150, 44.01)];
    toolbar.tintColor = [UIColor clearColor];
    [toolbar setTranslucent:YES];

    // create the array to hold the buttons, which then gets added to the toolbar
    NSMutableArray* buttons = [[NSMutableArray alloc] initWithCapacity:4];


    // Create a comments button
    propertiesButton = [[UIBarButtonItem alloc]
                        initWithBarButtonSystemItem:UIBarButtonSystemItemSearch target:self action:@selector(properties)];
    [buttons addObject:propertiesButton];
    [propertiesButton release];

    // Create a comments button
    commentaryButton = [[UIBarButtonItem alloc]
                        initWithBarButtonSystemItem:UIBarButtonSystemItemCompose target:self action:@selector(comments)];
    [buttons addObject:commentaryButton];
    [commentaryButton release];

    // create a versions button
    versionsButton = [[UIBarButtonItem alloc]
                      initWithBarButtonSystemItem:UIBarButtonSystemItemBookmarks target:self action:@selector(versions)];
    [buttons addObject:versionsButton];
    [versionsButton release];

    // create a save button
    downloadButton = [[UIBarButtonItem alloc]
                      initWithBarButtonSystemItem:UIBarButtonSystemItemOrganize target:nil action:@selector(download)];
    [buttons addObject:downloadButton];
    [downloadButton release];

    // stick the buttons in the toolbar
    [toolbar setItems:buttons animated:NO];

    [buttons release];

    // and put the toolbar in the nav bar
    self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:toolbar] autorelease];
    [toolbar release];
}

- (void)dealloc
{
    [popOverController release];
    [propertiesButton release];
    [downloadButton release];
    [versionsButton release];
    [commentaryButton release];
    [webView release];
    [super dealloc];
}

С NSZombieEnabled я получаю

'2011-08-01 10:30:36.571 ProjectName[100:707] *** -[UIBarButtonItem release]: message sent to deallocated instance 0x1fb330'

Мы не уверены, как решить проблему.

Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 02 августа 2011

Вы освобождаете свойства Кнопка, кнопка загрузки, кнопка Версии, кнопка Комментарий два раза.Первый раз в viewDidLoad и снова в dealloc.

Вам не нужно выпускать их в dealloc, как вы уже выпустили их в viewDidLoad.

0 голосов
/ 02 августа 2011

Насколько я понимаю, вы отпускаете свои кнопки дважды. Первый раз в вашей функции viewDidLoad () и, наконец, в вашей функции dealloc.

0 голосов
/ 02 августа 2011

Вы уже выпускаете свои UIBarButtonItem после того, как добавляете их в массив - поэтому вы не должны освобождать их снова в методе dealloc - эти дополнительные вызовы освобождения приводят к отправке сообщения на уже освобожденные кнопки и к аварийному завершению вашего приложения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...