Я пропускаю этот объект ObjectiveC? - PullRequest
1 голос
/ 18 декабря 2011
@interface foo: NSObject
@property (nonatomic, retain) NSMutableArray *aMutableArray;
@end

@implementation
@synthesize aMutableArray

-(void)somefunction {
    // Illustration
    self.aMutableArray = [[[NSMutableArray alloc]init]autorelease];
    self.aMutableArray = [[[NSMutableArray alloc]init]autorelease];
    self.aMutableArray = [[[NSMutableArray alloc]init]autorelease];
}
@end

Я сделал код, аналогичный коду в других частях моей программы, но я должен был быть уверен, что это не приведет к утечке памяти.С моим пониманием autorelease этот объект освобождается правильно, верно?

[EDIT - добавлен вопрос] Хотя один вопрос: у свойства выше есть атрибут retain, поэтому, когда компилятор создаетфункция установки, код установки будет выглядеть примерно так:

somecode..
retain newObj
release oldObj
somecode..

В приведенном выше коде я назначил 3 объекта aMutableArray.Каждый раз, когда они присваиваются, функция setter сохраняет в newObj и release в oldObj.Итак, поскольку метод setter уже выполнил освобождение, возникнет ли проблема, когда авто-релиз включится, чтобы освободить объект во второй раз?

1 Ответ

4 голосов
/ 18 декабря 2011

Да, он будет выпущен правильно, если вы также активируете метод dealloc:

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

Обратите внимание, что вы можете сократить свой код, используя эквивалентный +array метод NSMutableArray:

self.aMutableArray = [NSMutableArray array];
...