строка или nsstring со строкой - PullRequest
4 голосов
/ 07 апреля 2010

Предположим, что myProp @property (retain) NSString * myProp и синтезирован для нас ....

self.myProp = @"some value";//string literal?

self.myProp = [NSString stringWithString:@"some value"];

Есть ли здесь разница?Первый ли это строковый литерал, который не освобождается автоматически или он просто находится в памяти для текущей области, и мне не нужно об этом беспокоиться?

Ответы [ 3 ]

4 голосов
/ 07 апреля 2010

Возможно, вы захотите провести некоторое время с Руководство по программированию . Из связанного раздела (о создании @"string constants"):

Такой объект создается при компиляции время и существует на протяжении всего вашего выполнение программы. Компилятор делает такие константы объекта уникальными на на основе модуля, и они никогда освобождены, хотя вы можете сохранить и отпустите их, как и любой другой объект.

1 голос
/ 08 апреля 2010

Чтобы добавить к сообщениям Джошуа и Престона, на самом деле [NSString stringWithString:xxx] возвращает само xxx, когда xxx является литералом.Это подробности реализации, поэтому вам не следует писать какую-либо программу, основанную на этом факте, но интересно знать.

Этот факт можно проверить следующим образом:

 NSString*a=@"foo";
 NSString*b=[NSString stringWithString:a];
 NSLog(@"a at %p, class %@",a,[a class]);
 NSLog(@"b at %p, class %@",b,[b class]);

По крайней мере, намой ящик 10.6.3, оба дают один и тот же адрес с классом NSCFString.

Помните: retain & release относятся к вашей ответственности за владение, и они не всегда уменьшают / увеличиваютсохранить счет.Реализация может делать любую оптимизацию, какую захочет, если указанная оптимизация не нарушает политику владения.

Или другими словами: напишите retain & release, чтобы объекты были сохранены / уничтожены в том случае, если реализация всегда делает наивное увеличение / уменьшение количества сохраняемых объектов.Это контракт между Какао и тобой.Но Какао может сделать и действительно много оптимизирует.

1 голос
/ 08 апреля 2010

Строковый литерал - это жестко закодированная строка NSString, которая существует неограниченное время во время работы приложения. Вы даже можете отправлять ему сообщения, на которые отвечает NSString, например [@"test" length].

Чтобы ответить на ваш вопрос, первая строка устанавливает свойство для строкового литерала, а вторая проходит дополнительный этап создания новой строки на основе строкового литерала.

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