Предложите лучший способ инициализации массива (или других объектов) - PullRequest
2 голосов
/ 16 ноября 2009

Я немного запутался в следующих двух способах инициализации .....

Путь 1:

- (void) myMethod{

    NSArray *myArray = [[NSArray alloc] initWithObjects:obj1,obj1,nil];
    [self setClassArray:myArray];
    [myArray release];
}

Способ 2:

- (void) myMethod{

NSArray *myArray = [NSArray arrayWithObjects:obj1,obj2,nil];
[self setClassArray:myArray];
}

В способе 1 я использовал метод alloc init, который является методом экземпляра, и, поскольку я использовал оператор alloc, я должен сам освободить массив.

В способе 2 я использовал статический метод для инициализации массива, и так как не используется оператор alloc, мне не нужно освобождать память, система позаботится об этом.

Способ 1, занимает много времени и может привести к утечке памяти, если не позаботиться

Способ 2, быстрее в написании, и вам не нужно заботиться о утечках памяти

Но, тем не менее, я видел way1, используемый в стандартных исходных кодах чаще, чем way2. Я понятия не имею, почему люди так делают или я ошибаюсь в каком-то месте.

Ответы и комментарии приветствуются. Пожалуйста, предложите лучшие практики программирования.

Ответы [ 4 ]

5 голосов
/ 16 ноября 2009

Ваш второй пример использует вспомогательный конструктор, который возвращает автоматически освобожденный объект. Тогда возникает вопрос, лучше ли использовать autorelease или alloc / release. Ответ mmalc в этом потоке StackOverflow объясняет недостатки автоматического высвобождения объектов. (В основном, используйте alloc / release всякий раз, когда это возможно.)

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

1 голос
/ 16 ноября 2009

При использовании метода 2 (autorelease) объект освобождается, когда операционная система чувствует, что у него нет ссылок. Но при использовании ручного деблокирования, как вы вводили в своем коде, вы можете деблокировать напрямую или в любое время.

1 голос
/ 16 ноября 2009

насколько я знаю,

[NSArray arrayWithObjects:obj1,obj2,nil];

возвращает автоматически выпущенный объект, что-то вроде

[[[NSArray alloc] initWithObjects:obj1,obj1,nil] autorelease];

и я предпочитаю не управлять памятью с помощью пула автоматического выпуска. может это просто предубеждение))

0 голосов
/ 16 ноября 2009

Я обычно предпочитаю второй способ, и, если я правильно помню, это то, что рекомендуют Apple Docs (используйте авто-выпуск, где это возможно).

В способе 1 память освобождается быстрее, поэтому, если у вас есть метод, который вызывается в цикле или рекурсивно, использование автоматического высвобождения может накапливать много памяти, в то время как alloc / retain будет держать ваш объем памяти низким.

С другой стороны, я предполагаю, что использование авто-релиза более эффективно, поскольку пул авто-релизов может высвобождать большой кусок памяти сразу, вместо маленьких кусков снова и снова. Хотя я могу ошибаться.

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