Objective-C Распределение объектов - PullRequest
1 голос
/ 04 января 2012

Рассмотрим следующие два распределения массивов:

NSMutableArray* alpha = [[[NSMutableArray alloc] init] autorelease];

NSMutableArray* beta = [NSMutableArray array];

Если предположить, что ничего не сохраняет alpha или beta, я понимаю, что результат обоих одинаков.Количество запоминаний на обоих будет равно 0, и поэтому они будут очищены, как только они покинут сферу.

У меня есть скрытое подозрение, что я не до конца осознаю тонкие следствия между ними.После прочтения ответа StackOverflow я знаю, что последний является удобным методом, но я хотел бы понять различия.

В чем разница между двумя приведенными выше строками кодов в отношении памятиуправление

Ответы [ 4 ]

4 голосов
/ 04 января 2012

Нет, вы правы. +[NSMutableArray array], вероятно, внутренне выглядит примерно так:

+ (id)array
{
    return [[[self alloc] init] autorelease];
}

"Фабричные методы", такие как +[NSMutableArray array], просто возвращают автоматически выпущенный экземпляр для вас. На самом деле, в некоторых оптимизированных классах Cocoa и Foundation есть нечто большее, чем это, но для целей семантики управления памятью это действительно так просто.

4 голосов
/ 04 января 2012

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

Правило состоит в том, что методы, которые возвращают объект, но не содержат в своем имени слова «new», «alloc», «retain» или «create», возвращают объект с автоматическим освобождением. Это логика +array возврата автоматически освобожденного объекта.

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

1 голос
/ 04 января 2012

Разницы нет вообще. Это просто ярлык.

1 голос
/ 04 января 2012

На самом деле между ними нет никакой разницы, кроме того, что второй выглядит чище и меньше байтов.

Как вы упомянули [NSMutableArray array] - это просто удобный метод, который на самом деле на самом деле возвращает довольнов точности то, что делает первый метод.

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