2010-04-07 63 views
4

的NSString让我们假设myProp是@property(保留)的NSString * myProp为我们合成....字符串或用绳子

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

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

之间有区别吗? 是第一个没有获得自动释放的字符串字面值,还是仅仅在内存中,因为它是当前的范围,我不必担心它?

+0

因为这个挂起了很多人。 – 2010-04-07 17:11:14

+0

只要使用字符串文字,如果你不确定,他们总是正确的选择。 – 2010-04-07 17:26:53

回答

4

您可能想花一些时间与String Programming Guide。从连接部分(有关创建@"string constants"):

这样的对象是在编译时 创建和整个 程序的执行存在。编译器 在每个模块基础上使这些对象常量在 上唯一,并且它们从不从 解除分配,尽管您可以保留并且 释放它们,就像您执行其他任何 对象一样。

+0

谢谢,那就是我的想法。看起来我会继续使用我的NSString对象。 – joels 2010-04-09 15:18:36

1

字符串文字是一个硬编码的NSString,它在应用程序运行时无限期地存在。您甚至可以发送NSString响应的消息,例如[@"test" length]

要回答你的问题,第一行是将属性设置为字符串文字,而第二行是通过基于字符串文字创建新字符串的额外步骤。

1

要添加到约书亚和普雷斯顿的帖子,其实[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和你之间的合同。但可可可以做,并确实做了很多优化。