【问题标题】:NSString allocation and initializingNSString 分配和初始化
【发布时间】:2012-02-13 01:23:13
【问题描述】:

有什么区别:

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

【问题讨论】:

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


【解决方案1】:

变量string1 是一个NSString string literal。编译器在您的可执行文件中为其分配空间。它会在程序运行时加载到内存中并初始化。只要应用程序运行,它就会一直存在。你不需要retainrelease 它。

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

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

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

labelsText.text = titleOfButton;

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

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

【讨论】:

  • 只是为了扩展这一点,在 Objective C 中对 @ 风格的字符串文字上的 retainrelease 的调用被明确忽略。你可以整天release它,它不会被释放。
  • 所以基本上,我在该代码中的所有内容都是正确的,我可以删除 newLabelText 字符串吗?然后用户labelsText合成setter来设置标题?我还是个新手,但是当您说“设置此保留属性”时,您是说我应该保留它吗?
  • labelsText.text 属性保留了您设置的字符串。所以你不需要使用retain,因为你正在使用属性值分配来为你做这件事。有关 Objective-C 属性的详细说明,请参阅本教程:raywenderlich.com/2712/using-properties-in-objective-c-tutorial
猜你喜欢
  • 1970-01-01
  • 2010-10-12
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 2011-11-26
  • 1970-01-01
相关资源
最近更新 更多