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