Alloc + initWithString: такой же, как copy? - PullRequest
1 голос
/ 05 декабря 2011

По сути, вопрос в том, являются ли следующие по существу одинаковыми?

NSString *value1 = ...;
NSString *value2 = [[NSString alloc] initWithString:value1];

и

NSString *value1 = ...;
NSString *value2 = [value1 copy];

Ответы [ 2 ]

5 голосов
/ 05 декабря 2011

Концептуально, да. Однако есть одно отличие: alloc всегда создает новую строку, тогда как copy может возвращать одну и ту же строку.

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

initWithString: находится посередине: он может освободить получателя и вернуть строку, которую вы ему дали, подобно тому, как copy может вернуть получателя. Однако, если это произойдет, это означает, что вы потратили впустую на создание строки, которую вы создали с alloc. С copy вам вообще не нужно создавать никаких дополнительных объектов.

Единственная причина использования alloc и initWithString: заключается в том, что у вас есть собственный подкласс NSString и вы хотите создать его экземпляр из существующей строки. copy не будет использовать желаемый подкласс. Поскольку создание подклассов NSString практически никогда не оправдано в Какао, то же самое относится и к использованию initWithString: (или stringWithString:).

Таким образом, нижняя строка, просто используйте copy (или mutableCopy). Короче, яснее о ваших намерениях и может быть быстрее.

0 голосов
/ 05 декабря 2011

Не изменяемые строки обрабатываются немного по-особенному по сравнению с обычными объектами, поэтому в этом случае, да, две операции одинаковы.

То есть:

NSString *str1 = @"string";
NSString *str2 = [str1 copy];
NSString *str3 = [[NSString alloc] initWithString: str1];

NSLog(@"str1: %p, str2: %p, str3: %p", str1, str2, str3);

Что дает мне следующий вывод:

str1: 0x108a960b0, str2: 0x108a960b0, str3: 0x108a960b0

Поскольку адреса указателей одинаковы, речь идет об одном и том же объекте.

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