2010-05-16 8 views
0

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

У меня есть Core Data Entity с отношения ко многим для ключевых «детей». Для того, чтобы получить доступ к детям как массив, отсортированный по «позиции» колонке, я написал класса модели таким образом:

@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 и возвращенные arrangedChildren (первый и последняя строка убранного детского геттера). Метод NSSet allObjects уже возвращает сохраненный массив? Возможно, слишком поздно, и у меня передозировка кофе.

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

ответ

3

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

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

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

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

Наконец, вы не должны сохранить возвращаемое значение здесь - ваш метод не называется, начиная с alloc, new или create и, таким образом, абоненты должны take ownership explicitly.

Я рекомендую прочитать "Cocoa Memory Management Guide" и раздел на "Declared Properties" в описании объекта Objective-C.

+0

Я только что прочитал вашу ссылку на раздел «Управление владением и удалением объектов» управления памятью, и я думаю, что сейчас понимаю. Думаю, мне нужно снова прочитать весь путеводитель, поскольку я уверен, что я пропустил это в первый раз. Очень полезный ответ! Благодаря! –

+0

Учитывая, что вы никогда не читали ивара, кажется бессмысленным иметь его вообще. Сделайте свойство readonly, а переменная 'builtChildren' - локальной для метода. Затем, как говорит Георг, не сохраняйте/освобождать неубранных детей и не устраивайте организованных детей. И вы можете потерять '@synthesize ...' тоже. – JeremyP

0

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

+0

Спасибо за подсказку, я забыл скопировать метод dealloc на сообщение, поскольку я оставил остальную часть класса. –

Смежные вопросы