Objective C статические и динамические конструкторы - PullRequest
1 голос
/ 10 августа 2010

Лучше ли иметь статические конструкторы, в которых вы размещаете экземпляр в конструкторе и возвращаете экземпляр в виде автоматического освобождения, например, [String stringWithFormat...], или лучше иметь динамические конструкторы, в которых вы сначала просите пользователя выделить его, чтобы онотвечает за выпуск?Когда вы должны использовать каждый?

Приветствия

Ответы [ 2 ]

4 голосов
/ 10 августа 2010

Во-первых, в Objective-C не существует такого понятия, как «конструктор». Также нет «статических и динамических конструкторов». Вы получили порчу C ++, и это мешает вашей способности понимать Objective-C! :)

Вы захотите прочитать (и перечитать) руководство по управлению памятью .

Особенно специфично для вашего вопроса, если у вас есть метод класса, такой как +stringWithFormat:, тогда этот метод должен возвращать автоматически выпущенный экземпляр. Как правило, это будет реализовано как:

+ stringWithFoo: (Foo *) aFoo
{
     return [[[self alloc] initWithFoo: aFoo] autorelease];
}

(слегка упрощено, чтобы избежать шума varargs).

1 голос
/ 10 августа 2010

Я не уверен, что «статические» и «динамические» являются подходящими терминами.

[NSString stringWithFormat:...] - это удобный метод.Если вам нужна отформатированная строка, которую вы не собираетесь хранить слишком долго, вы можете использовать этот удобный метод, чтобы избежать беспорядка, который alloc + initWithFormat: + release может внести в ваш [в противном случае простой] код.

[[NSString alloc] initWithFormat:...] иногда яснее для читателя, что время жизни этого объекта будет обрабатываться явно (т. Е. С release позже), хотя я обнаружил, что встречается [[[NSString alloc] initWithFormat:...] autorelease]местами.

Когда вы разрабатываете класс, вы должны определить, предназначены ли экземпляры вашего класса для частого / быстрого использования, а не для длительного (или того и другого).Если вы считаете, что ваши классы можно использовать часто или быстро, то предоставление удобного метода поможет уменьшить беспорядок и упростить код, который использует класс.

Например, NSWindowне класс, который вы часто создаете и удаляете экземпляры, поэтому нет удобных методов для создания NSWindow экземпляров, вам нужно пройти по маршруту alloc + init (на самом деле, NSWindow обычно не являетсякласс, который вы должны создать экземпляры вручную в любом случае).С другой стороны, строки, массивы, словари, наборы и т. Д., Это все вещи, которые часто создаются и часто отбрасываются, поэтому у них всех есть удобные методы, которые облегчают их создание и управление ими.

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