Выпуск NSArray назначен на UIBar - PullRequest
       19

Выпуск NSArray назначен на UIBar

1 голос
/ 30 августа 2011

В моем приложении я хочу сделать массив, добавить на панель инструментов и затем отпустить его. Однако, когда я выпускаю его, мое приложение вылетает. Почему так...? Что делать, чтобы его опустить?

UIImage *button1Image = [UIImage imageNamed:@"button1Image.png"];
cameraToolbar = [[UIToolbar alloc] init]; //declared in .h
UIBarButtonItem *button1 = [[ UIBarButtonItem alloc ] initWithTitle: @"qwerty" style: UIBarButtonItemStyleBordered target: self action: @selector(doAction)];
[button1 setImage:button1Image];
//same method to add flexItem and button2Image

NSArray *items = [NSArray arrayWithObjects: button1, flexItem, button2, nil];
[cameraToolbar setItems:items animated:NO];
self.view = cameraToolbar;

[items release]; // here it crashes, why? How to fix?
[button1 release];
[button2 release];
[flexItem release];
[button1Image release]; // here i get "Incorrect decrement of the reference count 
//of an object that is not owned at this point by the caller"
[button2Image release];

Ответы [ 2 ]

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

button1Image назначается объекту, который автоматически высвобождается и, следовательно, не должен отправляться сообщение о выпуске. Управление памятью основано на подсчёте ссылок на объекты, и когда счётчик станет равным нулю, память будет освобождена. Сообщение о выпуске уменьшает количество ссылок на единицу.

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

[NSArray arrayWithObjects:] является методом класса , который возвращает массив, который является автоматически выпущенным объектом .so u не должен освобождать его .

если вы используете для создания объекта с подобным alloc, copy, retain, то только вы несете ответственность за их освобождение.

NSArray *items=[[NSArray alloc]initWithObjects:button1, flexItem, button2, nil];


............



[items release];

как это для button1Image object.take care

...