Начинающий Objective-C NSString Вопрос - PullRequest
2 голосов
/ 27 ноября 2010
NSString *notAllocatedString = @"This string was not allocated.";
NSString *allocatedString = [[NSString alloc] initWithFormat:@"This string was allocated."];

NSLog(@"%@", notAllocatedString);
NSLog(@"%@", allocatedString);

Обе эти строки печатаются отлично. В чем именно разница между этими двумя? Я имею в виду, я понимаю, что часть памяти выделена для второго и должна быть освобождена, но кроме этого - каковы преимущества и недостатки каждого из них?

Ответы [ 3 ]

3 голосов
/ 27 ноября 2010

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

Второй: вы создали его во время выполнения и отвечаете за память,Это метод, который вы должны использовать, когда строка является динамической.Он скопирует содержимое статической строки в allocatedString

Подводя итог, вы создаете ненужные издержки, используя initWithFormat, когда строка статическая.Статическая строка будет создана обоими способами, второй способ просто скопирует содержимое в другой NSString.

1 голос
/ 27 ноября 2010

-initWithFormat: полезно, когда вам нужно заменить материал, который вы не знаете (и / или не можете знать) во время компиляции.

Например:

id value = ...; //some user-entered value, say like "42"
NSString * allocatedString = [[NSString alloc] initWithFormat:@"The user-entered value is: %@", value];
NSLog(@"%@", allocatedString); //logs "The user-entered value is: 42"
[allocatedString release];
0 голосов
/ 22 ноября 2013

Появление Objective-C 2.0 дало разработчикам удовольствие от удобного синтаксиса, который позволяет более свободно и динамично объявлять переменные, подобно тому, что вы получаете в языках сценариев. В вашем случае нет разницы между двумя инструкциями в разделе Автоматический подсчет ссылок. Существует аналогичный сокращенный синтаксис для объявления других структур данных Objective C (например, NSArray * array = [@ "Foo", @ "Bar", @ "Hello World"];)

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