任何人都可以区分:
NSString* myStr = @"Some value";
和
NSString* myStr = [[NSString alloc] initWithString:@""];
为什么我应该分配一个字符串,即使我可以直接给出一些值..?
答案 0 :(得分:2)
考虑您要存储一个传入的字符串,与传入时的方式完全相同:
@implementation AddressCard;
-(NSString *) name
{
return name;
}
-(void) setName: (NSString *) theName
{
[name release];
name = [[NSString alloc] initWthString: theName];
}
//rest of class implementation code snipped
@end
如果你只使用
-(void) setName: (NSString *) theName
{
[name release];
name = [theName retain];
}
然后传入的NSMutableString
因为名称可以在以后更改,而没有在AddressCard中明确设置name属性。这通常不是人们想要的。
答案 1 :(得分:2)
来自Apple的String Programming Guide,“Creating Strings”
在源代码中创建字符串对象的最简单方法是使用Objective-C @“...”结构:
NSString *temp = @"/tmp/scratch";
请注意,以这种方式创建字符串常量时,应避免使用除7位ASCII字符之外的任何内容。这样的对象是在编译时创建的,并且在整个程序的执行过程中都存在。编译器使这些对象常量在每个模块的基础上是唯一的,并且它们永远不会被释放,尽管您可以像执行任何其他对象一样保留和释放它们。
“编译器使这些对象常量唯一[...]”向我建议每个模块的字符串文字为interned。据我所知,实习和物体寿命&内存管理是两种方法之间的主要区别。
至于为什么有人可能会使用后者,如果由于某种原因你希望myStr
不是一个唯一的实习字符串,那么你可以尝试-initWithString:
方法,尽管实习字符串仍然存在存在,使用-copy
会更简单(正如NR4TR指出的那样)和(正如Yuji在评论中指出的那样)结果字符串可能与字符串文字完全相同,尽管Apple的文档建议。
答案 2 :(得分:0)
所有关于内存管理因此如果你写
NSString * myStr = @“某些值”;
它将使用某些资源分配字符串值,并且在脚本结束时内存将自动释放,如第二种情况所示
NSString * myStr = [[NSString alloc] initWithString:@ “”];
指定一些内存,使用该变量后,可以释放变量的内存。因此,您进行自我记忆管理。因此,在第二种情况下,内存泄漏的可能性较小。第一种情况完全取决于垃圾收集,这种语言不太可靠。