【问题标题】:NSString Assignment & RetainingNSString 分配和保留
【发布时间】:2010-08-09 08:57:42
【问题描述】:

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

【问题讨论】:

  • 我基本上要问的是,在上面的代码中,我应该更明确地释放旧值并保留 substringToIndex 值,还是只使用 self.currentDiscountedPrice = 两个分配?
  • OT:我会写 parsedCharacters.length == 0,而不是 parsedCharacters == nil || [parsedCharacters isEqualToString:@""]。由于 Objective-C 的 message-to-nil 语义,这将检测到nil,对于非 nil 可能会稍微快一些,当然也更简单。

标签: cocoa nsstring constants retain


【解决方案1】:

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

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2010-11-25
    • 2010-11-24
    • 1970-01-01
    • 2011-04-13
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多