2010-04-07 3 views
4

Давайте предположим, что myProp является @property (сохранить) NSString * myProp и синтезируют для нас ....строка или NSString шпагатом

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

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

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

+0

Напротив, так как это подвешивает много людей. –

+0

Просто используйте строковые литералы, если вы не уверены, они всегда являются правильным выбором. –

ответ

4

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

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

+0

Спасибо, вот что я думал. Похоже, я продолжу использовать свой объект NSString. – joels

1

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

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

1

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

Вы можете проверить этот факт таким образом:

NSString*[email protected]"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 так, что объекты сохранены/уничтожены в случае реализации всегда делает наивная увеличение/уменьшение удержания счета. Это контракт между Какао и вами. Но Cocoa может делать и действительно делает большую оптимизацию.

Смежные вопросы