让我们假设myProp是@property(保留)NSString * myProp并为我们合成....
self.myProp = @"some value";//string literal?
self.myProp = [NSString stringWithString:@"some value"];
这里有区别吗? 第一个字符串文字是不是自动释放的,还是只是在内存中它的当前范围,我不必担心它?
答案 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可以做并且确实做了很多优化。