有什么区别:
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。请不要说我应该,我只是在这里找出为什么会这样。谢谢!
答案 0 :(得分:13)
变量string1
是NSString
string literal。编译器在可执行文件中为它分配空间。它被加载到内存中并在程序运行时进行初始化。只要应用程序运行,它就会存在。您无需retain
或release
。
变量string2
的生命周期只要你指定,直到你release
最后一次引用为止。你为它分配空间,所以你负责清理它。
变量titleOfButton
的生命周期是方法-clicked:
的生命周期。这是因为方法-titleForState:
会返回autorelease
- d NSString
。一旦离开方法的范围,该字符串将自动释放。
您无需创建newLabelText
。这一步是多余和混乱的。只需将labelsText.text
属性设置为titleOfButton
:
labelsText.text = titleOfButton;
为什么要使用属性?因为设置此retain
属性会将引用计数titleOfButton
增加一(这就是它被称为retain
属性的原因),因此titleOfButton
指向的字符串将活过-clicked:
的结尾。
在此示例中考虑使用retain
的另一种方法是labelsText.text
对titleOfButton
指向的字符串“取得所有权”。该字符串现在将持续labelsText
生存(除非某些其他变量也取得字符串的所有权)。