【问题标题】:Objective-C copy and retainObjective-C 复制和保留
【发布时间】:2023-04-05 14:24:01
【问题描述】:

什么时候应该使用复制而不是保留?没看懂。

【问题讨论】:

标签: objective-c copy retain


【解决方案1】:

当你想保证对象的状态时,你会使用copy

NSMutableString *mutString = [NSMutableString stringWithString:@"ABC"];
NSString *b = [mutString retain];
[mutString appendString:@"Test"];

此时 b 刚刚被那里的第 3 行弄乱了。

NSMutableString *mutString = [NSMutableString stringWithString:@"ABC"];
NSString *b = [mutString copy];
[mutString appendString:@"Test"];

在这种情况下,b 是原始字符串,不会被第 3 行修改。

这适用于所有可变类型。

【讨论】:

  • 值得注意的是,很多不可变类型会通过调用-retain来实现-copy;由于它们的值永远不会改变,因此在内存中拥有两个副本是没有意义的。也就是说,如果没有更多信息,您应该始终像不知道特定对象是否可变一样进行编码。仅仅因为您将属性键入为 NSString 并不意味着有人不会将 NSMutableString 传递给它(如上所示。)
【解决方案2】:

retain :在创建的对象上完成,只是增加了引用计数。

copy -- 它创建一个新对象,当创建新对象时,retain count 将为 1。 希望这对您有所帮助。

【讨论】:

  • 复制并不总是创建一个新对象
  • 所以在保留中我们增加了对同一个对象的引用计数,而对于复制我们增加了对新对象的引用计数?
【解决方案3】:

当您不希望收到的值在您不知情的情况下被更改时,复制很有用。例如,如果您有一个属性是 NSString 并且您依赖该字符串在设置后不会更改,那么您需要使用复制。否则,有人可以将NSMutableString 传递给您并更改值,这反过来又会更改您的NSString 的基础值。 NSArrayNSMutableArray 也是如此,只是在数组上复制只是将所有指针引用复制到一个新数组,但会阻止删除和添加条目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多