分配一个字符串并直接给出值

时间:2010-11-11 10:37:12

标签: objective-c

任何人都可以区分:

NSString* myStr = @"Some value";

NSString* myStr = [[NSString alloc] initWithString:@""];

为什么我应该分配一个字符串,即使我可以直接给出一些值..?

3 个答案:

答案 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:@ “”];

指定一些内存,使用该变量后,可以释放变量的内存。因此,您进行自我记忆管理。因此,在第二种情况下,内存泄漏的可能性较小。第一种情况完全取决于垃圾收集,这种语言不太可靠。

相关问题