新手Objective-C NSString问题

时间:2010-11-27 18:01:11

标签: objective-c nsstring

NSString *notAllocatedString = @"This string was not allocated.";
NSString *allocatedString = [[NSString alloc] initWithFormat:@"This string was allocated."];

NSLog(@"%@", notAllocatedString);
NSLog(@"%@", allocatedString);

这两个字符串都打印得很好。这两者究竟有什么区别?我的意思是,我明白为第二个分配了一段内存,应该被释放但除此之外 - 每个内容的优点和缺点是什么?

3 个答案:

答案 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”];)