Работа с объектами, возвращенными из удобных методов какао

StackOverflow https://stackoverflow.com/questions/255846

Вопрос

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top