Сохранить / назначить управление памятью - PullRequest
0 голосов
/ 04 ноября 2011

Я пытаюсь понять управление памятью на iOS. Я создал этот интерфейс:

@interface Player : NSObject {
    PlayerType pType;
    PlayerWeapon pWeapon;
}

@property(nonatomic, readwrite, retain) pType;
@property(nonatomic, readwrite, retain) pWeapon;

@end

и это в файле реализации:

@synthesize pType;
@synthesize pWeapon;

В заголовочном файле я использую свойство retain, потому что pType и pWeapon не являются стандартными структурами C. Из того, что я понимаю, если бы они были структурами C, я бы вместо этого использовал assign. Поскольку я использовал retain, означает ли это, что этот класс сохраняет объект или какой бы класс его ни создавал? Например, если я делаю это в другом классе:

Player *player = [[Player alloc] init];

Должен ли этот новый класс вызывать [player release] или объект будет автоматически освобожден?

Ответы [ 3 ]

1 голос
/ 04 ноября 2011

Хорошим общим правилом является то, что все, что вы выделяете / инициализируете или копируете, вы «создали» и имеете, поэтому вам придется выпустить его.Так что да, объект, которому принадлежит игрок, должен будет освободить его, когда это будет сделано с его помощью.Это применимо, если объект Player создается только для локальной области внутри метода или если это ivar.

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

// Retaining an autoreleased object
self.player=[Player playerWithName: @"George"];

или

player=[[Player playerWithName:  @"George"] retain]; 

Удачи

1 голос
/ 04 ноября 2011

Когда вы делаете свойство "сохраненным", метод сгенерированного компилятором метода берет на себя ответственность за то, чтобы объекты были освобождены и правильно сохранены.Это свойство по существу обрабатывает работу по освобождению предыдущего объекта, на который оно ссылалось, и сохраняет (принимает в собственность) объект, который был назначен.Вам также потребуется добавить следующий код в файл реализации, чтобы освободить эти объекты при освобождении объекта Player:

- (void) dealloc
{
    [pType release];
    [pWeapon release];
    [super dealloc];
}

Это означает, что даже если внутренние свойства «сохранены», когда «Player»"объект выделен, вам все равно придется освободить его в какой-то момент.

0 голосов
/ 04 ноября 2011

Вызывающий [[Player alloc] init] отвечает за отправку новому объекту Player сообщения release.Свойства объекта Player не влияют на эту ответственность.

...