Работа с объектами, возвращенными из удобных методов какао - PullRequest
1 голос
/ 01 ноября 2008

У меня много проблем с преждевременным освобождением объектов NSDate. Я подозреваю, что проблемы могут быть связаны с тем, как я работаю с объектами, возвращенными из удобных методов NSDate. Я думаю , что мое объявление свойства showDate в классе JKShow должно быть "сохранено", но изменение его на присвоение или копирование, похоже, не влияет на проблему.

JKShow *show; 
NSDate *date;
NSMutableArray *list = [[NSMutableArray alloc] init];

// Show 1
show = [[JKShow alloc] init];
//...
date = [gregorian dateFromComponents:dateComponents];
show.showDate = date;
[list addObject:[show autorelease]];

// Show 2
show = [[JKShow alloc] init];
//...
date = [gregorian dateFromComponents:dateComponents];
show.showDate = date;
[list addObject:[show autorelease]];

UPDATE

Проблема не была в коде, скопированном здесь. В моем методе JKShow init я не сохранил дату, возвращенную из удобного метода NSDate. Всем спасибо за помощь.

Ответы [ 4 ]

2 голосов
/ 01 ноября 2008

Если showDate является сохраняющим свойством, которого должно быть достаточно, учитывая код, который вы опубликовали. Что-то еще (возможно, в реализации JKShow) может быть неправильным.

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

Когда вы запускаете Инструменты таким образом, он записывает все жизненные периоды объектов и обратный след для каждого сохраненного и выпущенного против них выпуска. Если вы просматриваете объекты, находите одну из ваших дат и просматриваете все удержания и выпуски, вы сможете определить, где происходит поддельный выпуск.

2 голосов
/ 01 ноября 2008

Дата, возвращаемая из dateFromComponents, должна быть в пуле автоматического выпуска, поэтому вы правы, что ваше свойство showDate должно быть «сохранено». На самом деле так и должно быть (если только вы не хотите «копировать»).

Из кода, который вы показали, похоже, что вы передаете право собственности на свой шоу-объект полностью в список (так как вы устанавливаете на него автоматическое освобождение при добавлении). Вы говорите, что объекты даты освобождаются до того, как объекты шоу выходят из списка (или список освобождается)?

Кроме того, вы используете синтезированные свойства или пишете их от руки? Если последнее, каков ваш метод свойства setShowDate?

Вы также можете попробовать зарегистрировать retainCount объекта даты в разных местах (хотя я всегда нахожу, что авто-релиз действительно усложняет это).

0 голосов
/ 01 ноября 2008

Я понял, спасибо за вашу помощь, но проблема была вне кода, который я выложил здесь. Я не сохранил NSDate, созданный в моем методе init. К сожалению, сбой произошел только после того, как я создал два новых объекта NSDate, поэтому я полностью заколол не то дерево.

0 голосов
/ 01 ноября 2008

Код, который вы показали, не имеет проблем с преждевременным выпуском. Фактически, он пропустит массив и все, что в нем, потому что он не освободит массив.

Работаете ли вы с включенным сборщиком мусора?

Является ли list переменной экземпляра или статической переменной, или это локальная переменная?

...