字符串或带字符串的nsstring

时间:2010-04-07 16:39:36

标签: cocoa nsstring

让我们假设myProp是@property(保留)NSString * myProp并为我们合成....

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

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

这里有区别吗? 第一个字符串文字是不是自动释放的,还是只是在内存中它的当前范围,我不必担心它?

3 个答案:

答案 0 :(得分:4)

您可能希望在String Programming Guide上花一些时间。从链接部分(关于创建@"string constants"):

  

这样的对象是在编译时创建的   时间和存在于整个你的   程序的执行。编译器   使这样的对象常量唯一   每个模块的基础,他们永远不会   取消分配,但你可以保留和   像其他任何一样释放它们   对象

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

要添加Joshua和Preston的帖子,事实上[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以便在实现始终执行保留计数的天真增加/减少的情况下保留/销毁对象。这是Cocoa和你之间的合约。但是Cocoa可以做并且确实做了很多优化。