Objective-C Getter Управление памятью - PullRequest
0 голосов
/ 17 мая 2010

Я довольно плохо знаком с Objective-C и не уверен, как правильно обращаться с управлением памятью в следующем сценарии:

У меня есть базовый объект данных с отношением «ко-многим» для ключа «дети». Чтобы получить доступ к дочерним элементам в виде массива, отсортированного по столбцу «положение», я написал класс модели следующим образом:

@interface AbstractItem :  NSManagedObject  
{
    NSArray * arrangedChildren;
}

@property (nonatomic, retain) NSSet * children;
@property (nonatomic, retain) NSNumber * position;
@property (nonatomic, retain) NSArray * arrangedChildren;

@end


@implementation AbstractItem

@dynamic children;
@dynamic position;
@synthesize arrangedChildren;

- (NSArray*)arrangedChildren
{
    NSArray* unarrangedChildren = [[self.children allObjects] retain];
    NSSortDescriptor* sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"position" ascending:YES];
    [arrangedChildren release];
    arrangedChildren = [unarrangedChildren sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
    [sortDescriptor release];
    [unarrangedChildren release];
    return [arrangedChildren retain];
}

@end

Я не уверен, сохранять или нет unarrangedChildren и возвращенные планируемые дети (первая и последняя строка метода аранжированных детей) Метод NSSet allObjects уже возвращает сохраненный массив? Возможно, уже слишком поздно, и у меня передозировка кофе.

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

Ответы [ 2 ]

3 голосов
/ 17 мая 2010

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

Что касается arrangedChildren, оно будет сохранено, только если вы используете синтезированный сеттер:

self.arrangedChildren = [unarrangedChildren sortedArrayUsingDescriptors:/*...*/];

Непосредственное присвоение переменной экземпляра, как вы, не вызывает синтезированный установщик.

Наконец, вы не должны сохранять возвращаемое значение здесь - ваш метод не имеет имени, начинающегося с alloc, new или create, и поэтому вызывающие абоненты должны явным образом вступить во владение .

Я рекомендую прочитать «Руководство по управлению памятью какао» и раздел «Объявленные свойства» в описании языка Objective-C.

0 голосов
/ 17 мая 2010

retain в вашем @property для упорядоченных детей должен позаботиться об этом. Вам нужно будет release сделать это в своем дольке.

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