NSString *notAllocatedString = @"This string was not allocated.";
NSString *allocatedString = [[NSString alloc] initWithFormat:@"This string was allocated."];
NSLog(@"%@", notAllocatedString);
NSLog(@"%@", allocatedString);
这两个字符串都打印得很好。这两者究竟有什么区别?我的意思是,我明白为第二个分配了一段内存,应该被释放但除此之外 - 每个内容的优点和缺点是什么?
答案 0 :(得分:3)
第一个是静态的,编译器和运行时负责内存。你应该尽可能使用这种方法。编译器有一些很好的内存优化(就像所有相同的字符串将指向内存中的相同地址)。
第二个,你创建了一个运行时,你负责记忆。这是字符串动态时应该使用的方法。它会将静态字符串的内容复制到allocatedString
总而言之,当字符串是静态时,使用initWithFormat
会产生不必要的开销。静态字符串将以两种方式创建,第二种方式只是将内容复制到另一种NSString
。
答案 1 :(得分:1)
-initWithFormat:
对于你需要替换你在编译时没有(和/或不能)知道的东西很有用。
例如:
id value = ...; //some user-entered value, say like "42"
NSString * allocatedString = [[NSString alloc] initWithFormat:@"The user-entered value is: %@", value];
NSLog(@"%@", allocatedString); //logs "The user-entered value is: 42"
[allocatedString release];
答案 2 :(得分:0)
Objective-C 2.0的出现为开发人员提供了方便的语法乐趣,允许更自由,更动态的变量声明,类似于您在脚本语言中所获得的。在您的情况下,自动引用计数下的两个语句之间没有区别。有类似的简写语法用于声明其他Objective-C数据结构(例如NSArray * array = [@“Foo”,@“Bar”,@“Hello World”];)