NSString分配和初始化

Jon*_*Wei 11 xcode cocoa cocoa-touch objective-c nsstring

有什么区别:

NSString *string1 = @"This is string 1.";
Run Code Online (Sandbox Code Playgroud)

NSString *string2 = [[NSString alloc]initWithString:@"This is string 2.];
Run Code Online (Sandbox Code Playgroud)

为什么我不分配和初始化第一个字符串,但它仍然有效?我以为我应该分配NSString,因为它是一个对象?

在Cocoa Touch,

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

为什么我不为titleOfButton字符串分配和初始化?我打电话的方法是否适合我?

另外,我正在使用XCode 4,但我不喜欢iOS 5等等,所以如果重要的话我不会使用ARC.请不要说我应该,我只是在这里找出为什么会这样.谢谢!

Ale*_*lds 13

变量string1是一个NSString 字符串文字.编译器在可执行文件中为它分配空间.它被加载到内存中并在程序运行时进行初始化.只要应用程序运行,它就会存在.你不需要retainrelease它.

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

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

你不需要创建newLabelText.这一步是多余和混乱的.只需将labelsText.text属性设置为titleOfButton:

labelsText.text = titleOfButton;
Run Code Online (Sandbox Code Playgroud)

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

考虑retain在这个例子中使用的另一种方法labelsText.text是对所指向的字符串"取得所有权" titleOfButton.该字符串现在将持续与labelsText生命一样长(除非某些其他变量也取得字符串的所有权).