1

只是关于 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 & release 是无害的,这是真的吗?

4

1 回答 1

1

NSString 并不特殊;所有 Cocoa 对象都遵循Cocoa 内存管理规则。只要你也这样做,你会没事的。

有人告诉我在常量字符串上调用保持和释放是无害的,这是真的吗?

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

......我应该更明确地释放旧值并保留该substringToIndex值还是可以只self.currentDiscountedPrice =用于两个分配?

您应该在任何地方使用该属性,但在init方法和dealloc. 这些是唯一应该向实例变量中的对象显式发送retain和消息的方法。release

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

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

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

于 2010-08-09T09:18:09.187 回答