NSString分配和初始化

时间:2012-02-13 01:23:13

标签: objective-c xcode cocoa-touch cocoa nsstring

有什么区别:

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。请不要说我应该,我只是在这里找出为什么会这样。谢谢!

1 个答案:

答案 0 :(得分:13)

变量string1NSString string literal。编译器在可执行文件中为它分配空间。它被加载到内存中并在程序运行时进行初始化。只要应用程序运行,它就会存在。您无需retainrelease

变量string2的生命周期只要你指定,直到你release最后一次引用为止。你为它分配空间,所以你负责清理它。

变量titleOfButton的生命周期是方法-clicked:的生命周期。这是因为方法-titleForState:会返回autorelease - d NSString。一旦离开方法的范围,该字符串将自动释放。

您无需创建newLabelText。这一步是多余和混乱的。只需将labelsText.text属性设置为titleOfButton

即可
labelsText.text = titleOfButton;

为什么要使用属性?因为设置此retain属性会将引用计数titleOfButton增加一(这就是它被称为retain属性的原因),因此titleOfButton指向的字符串将活过-clicked:的结尾。

在此示例中考虑使用retain的另一种方法是labelsText.texttitleOfButton指向的字符串“取得所有权”。该字符串现在将持续labelsText生存(除非某些其他变量也取得字符串的所有权)。