Чтобы добавить к сообщениям 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 может делать и действительно делает большую оптимизацию.
Напротив, так как это подвешивает много людей. –
Просто используйте строковые литералы, если вы не уверены, они всегда являются правильным выбором. –