NSString的分配和初始化

12

什么是以下两者的区别:

NSString *string1 = @"This is string 1.";

NSString *string2 = [[NSString alloc]initWithString:@"This is string 2.];

为什么我没有分配和初始化第一个字符串,但它仍然能工作? 我以为由于NSString是一个对象,所以我应该分配它?

在Cocoa Touch中,

-(IBAction) clicked: (id)sender{
   NSString *titleOfButton = [sender titleForState:UIControlStateNormal];
   NSString *newLabelText = [[NSString alloc]initWithFormat:@"%@", titleOfButton];
   labelsText.text=newLabelText;
   [newLabelText release];
}

为什么我没有为titleOfButton字符串分配和初始化内存?我调用的方法是否会为我完成这个过程?

此外,我正在使用XCode 4,但我不喜欢iOS 5等版本,因此如果有影响的话,我不使用ARC。请不要告诉我应该使用ARC,我只是想弄清楚为什么这样。


可能是重复的问题:NSString对象需要alloc和init吗? - Caleb
1个回答

15
变量string1是一个NSString字符串文字。编译器在可执行文件中为其分配空间,程序运行时将其加载到内存中并进行初始化。它的生命周期与应用程序相同。您无需retainrelease它。
变量string2的生命周期由您决定,直到您release其最后一个引用为止。你需要为它分配空间,所以你负责清理它。
变量titleOfButton的生命周期为方法-clicked:的生命周期。这是因为方法-titleForState:返回一个autoreleaseNSString。一旦离开方法的范围,该字符串将被自动释放。
您不需要创建newLabelText。这一步骤是多余和混乱的。只需将labelsText.text属性设置为titleOfButton即可:
labelsText.text = titleOfButton;

使用属性的原因是什么?因为设置retain属性会将titleOfButton的引用计数增加一(这就是为什么它被称为retain属性),所以由titleOfButton指向的字符串将在-clicked:结束后继续存在。

这个例子中使用retain的另一种思考方式是,labelsText.text“拥有”了由titleOfButton指向的字符串。除非其他变量也拥有该字符串,否则该字符串将持续到labelsText存在的时间。


仅仅是进一步阐述这个点,针对Objective C中@风格的字符串字面量,调用retainrelease方法都会被显式地忽略。你可以无限制地进行release操作,但它不会被释放。 - StilesCrisis
所以基本上,我代码里的所有东西都是正确的,我只需要移除newLabelText字符串?然后使用user labelsText生成的setter来设置标题?我还是有点新手,但当你说“设置这个保留属性”时,你是说我应该保留它吗? - Jon Wei
labelsText.text 属性会保留你设置的字符串。所以你不需要使用 retain,因为你正在使用属性值赋值来完成这个操作。请参考这个教程,了解更详细的 Objective-C 属性解释:http://www.raywenderlich.com/2712/using-properties-in-objective-c-tutorial - Alex Reynolds

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接