Objective-C: выделение объекта в рамках инициализации другого объекта (управление памятью) - PullRequest
1 голос
/ 12 мая 2010

По моему .h file у меня есть:

NSMutableArray *myArray;
@property (nonatomic, retain) NSMutableArray *myArray;

Мой .m file выглядит в основном так:

@synthesize myArray;

- (id) init {
    self = [super init];

    if (self != nil)
    {
        self.myArray = .... ? // here I want to create an empty array
    }

    return self;
}

- (void) dealloc {
    [self.myArray release];

    [super dealloc];
}

В чем я не уверен, так это в init.

1)

self.myArray = [[NSMutableArray alloc] init];

2)

NSMutableArray *tmp = [[NSMutableArray alloc] init];
self.myArray = tmp;
[tmp release];

Решение 1 мне не кажется правильным, из-за моей настройки @property (retain) я автоматически увеличиваю счетчик сохранения при настройке self.myArray, но дополнительно у меня уже есть «+1 сохранение» из-за [NSMutableArray alloc] и затем заканчивается счет 2 для этого объекта, но только один раз в dealloc. Таким образом, второе решение кажется мне более правильным, хотя оно и громоздко.

Также мне интересно, действительно ли self.myArray = ... совпадает с [self setMyArray:...] и, таким образом, увеличивает количество сохраняемых данных.

UPDATE

Я действительно нашел ответы (и даже более подробную информацию) здесь на случай, если кто-то захочет больше читать.

Ответы [ 3 ]

4 голосов
/ 12 мая 2010

self.myArray = точно так же, как [self setMyArray:...].

Однако вы можете сделать myArray = [[NSMutableArray alloc] init];, что в конечном итоге с сохранением счетчика 1 и будет полностью законным.

1 голос
/ 12 мая 2010

Другой вариант - использовать вспомогательные методы, возвращающие автоматически выпущенные экземпляры:

self.myArray = [NSMutableArray array];
1 голос
/ 12 мая 2010

Да, self.myArray = ... совпадает с [self setMyArray:...]

Таким образом, заданный процесс добавляет избыточное сохранение к вашему объекту. Вы, вероятно, должны выпустить его сразу после набора, хотя я видел некоторый код, который использует авто-релиз, так или иначе. Оба подхода неудобны.

Возможно избежать доступа к установленным средствам доступа (myArray = ...), но обходники доступа также недовольны пуристами.

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