NSString Assignment&保留

时间:2010-08-09 08:57:42

标签: cocoa nsstring constants retain

关于NSStrings的一个简单问题,我有一段代码为字符串赋值,具体取决于发现它是由substringToIndex分配的值还是常量字符串@“0.00”,是否可以使用

// Save if value found, otherwise set to 0.00
if (parsedCharacters == nil || [parsedCharacters isEqualToString:@""])
        self.currentDiscountedPrice = @"0.00";
else
{
  // Truncate extra digits from string to 2 decimal places (find full stop, save 2 places after it)
  NSRange fullStopRange = [parsedCharacters rangeOfString:@"."];
  self.currentDiscountedPrice = [parsedCharacters substringToIndex:(fullStopRange.location + 3)];
}

用于分配,因为它将释放旧值&保留新价值?

无法知道var是否在上一次迭代中被赋予常量字符串或substringToIndex返回值,但我被告知调用retain&在常量字符串上释放是无害的,这是真的吗?

1 个答案:

答案 0 :(得分:1)

NSString并不特别;所有Cocoa对象都遵循the Cocoa memory-management rules。只要你这样做,你就没事了。

  

有人告诉我叫保留&在常量字符串上释放是无害的,这是真的吗?

是。您应该将它们视为您不拥有的任何其他字符串:如果您想拥有它,请保留它,或者复制并拥有它;然后一定要释放你拥有的东西。

  

...我是否应该明确释放旧值&保留substringToIndex值,或者只使用self.currentDiscountedPrice =进行两项分配?

您应该在init方法和dealloc中使用该属性。这些是唯一应该将retainrelease消息显式发送到实例变量中的对象的方法。

该段落双方的原因是您或子类可以为该属性实现自定义访问器。自定义行为可能对半上升或半释放对象运行很危险,但您可能在其他任何地方都需要它。

将常量字符串对象传递给属性设置器没有任何害处。它将保留或复制对象。

注意,当属性的值是具有可变变量的类的对象时(因为NSString具有NSMutableString),您应该将该属性声明为复制其值(@property(copy)@property(nonatomic, copy)) ,以便你不会共同拥有别人的可变对象。如果他们改变对象,这可能会给您带来问题,特别是如果您将对象存储在散列集合(例如字典键)中而不是实例变量中。