【问题标题】:IOS: Do i need to retain key in dictionary ios?IOS:我需要在字典 ios 中保留键吗?
【发布时间】:2013-09-14 10:38:09
【问题描述】:

我有我存储的字典

1)keys = 这是具有“assign”属性的“SimpleObject”的字符串属性

--2) value = "SimpleObject"

NSMutableDictionary 保留对象,所以我释放对象。密钥存在于同一个对象中。关键是字符串。

现在我需要在将字符串键添加到 dict 之前显式保留它吗?

【问题讨论】:

  • 请显示实际代码。 assign 引起轻微关注...
  • @property (readwrite, nonatomic, assign) NSString * instanceId; [currentPlayerPlist setObject:myObject forKey:object.instanceId]; [对象释放]; [myObject 发布];添加少量对象后游戏崩溃。当我保留字符串崩溃停止时。

标签: ios objective-c release nsmutabledictionary retain


【解决方案1】:

不,您不需要显式保留NSString,因为您的对象已经这样做了。由于字典保留了对象,NSString 不会被过早释放。

此外,NSDictionarymakes a copy of your string key,作为防止使用可变对象作为字典键的预防措施(这非常糟糕)。这就是为什么您可以随意更改对象内的那个键。当然这不会改变对象在字典中的位置。

【讨论】:

    【解决方案2】:

    答案是否定的。无论您是否使用 ARC。没有。

    【讨论】:

    • @property (readwrite, nonatomic, assign) NSString * instanceId; [currentPlayerPlist setObject:myObject forKey:object.instanceId]; [对象释放]; [myObject 发布];添加少量对象后游戏崩溃。当我保留字符串崩溃停止
    【解决方案3】:

    不,您不需要保留NSDictionary 的键(或值)。这是因为NSDictionary 复制了密钥。当您检索带有objectForKey: 的对象时,isEqual: 用于确定哪个键引用您传入的对象。

    【讨论】:

    • 它复制密钥或符合 NSCopy 协议。但这并不能保证释放或者它可以?就我而言,它是发布 :(
    【解决方案4】:

    Cocoa 中手动内存管理的基本规则是——担心你在那个对象或方法中正在做什么;不要担心任何其他对象在做什么。

    您所做的只是将密钥传递给字典的方法。 没有将它存储在任何地方。无论字典用它做什么,它都负责正确的内存管理。它的作用与您无关。

    (块有一个小例外,有时您必须在传递给与类型无关的方法之前复制它们。但现在我们不要担心这个。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-29
      • 1970-01-01
      • 2011-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多