gpt4 book ai didi

ios - 如何在 Objective-C 中使用 "copy"属性?

转载 作者:技术小花猫 更新时间:2023-10-29 10:35:49 26 4
gpt4 key购买 nike

我在网上阅读了很多资料,它们都解释了人们什么时候应该使用“copy”而不是“strong”。

“copy 属性是 strong 的替代品。它不是获取现有对象的所有权,而是创建您分配给该属性的任何内容的副本,然后获取该属性的所有权。只有符合 NSCopying 的对象 协议(protocol)可以使用这个属性..."

并且有很多示例代码显示使用“复制”时,原始值保持不变。

但是,我是 Objective-C 的新手。我真的很想知道如何使用新分配的值。具有“新值”的“新实例(副本)”在哪里?如果我愿意,是否需要任何其他方法来更改原始值?

如果有人能为这部分分享一个例子,而不是证明原始值没有改变的例子,那就太好了,到处都是。

最佳答案

什么 copy属性在幕后做的是创建一个像这样的 setter :

- (void)setMyCopiedProperty:(MyClass *)newValue {
_myCopiedProperty = [newValue copy];
}

这意味着每当有人做这样的事情时object.myCopiedProperty = someOtherValue; , someOtherValue发送一个copy消息告诉它复制自己。接收者然后得到一个新指针(假设 copy 被正确实现),除了接收者对象之外没有人可以访问它。

可以看看copy以某种方式具有排他性:

  • 设置属性的客户端无权访问实际设置值
  • 接收方无权访问原始传递值。

不过要注意以下警告:

  • 复制 NSArray不复制它的对象,所以你可能最终认为 @property(copy) NSArray<MyClass *> *myProperty是安全的,但是虽然数组本身是安全的,不会被修改,但数组持有的对象共享相同的引用。对于任何集合类( NSDictionaryNSSet 等)也是如此
  • 如果该属性与自定义类匹配,您需要确保 copy方法完成它的工作——即创建一个新对象。所有符合 NSCopying 的 Cocoa/CocoaTouch 类都会发生这种情况,但是对于其他类,这可能是正确的,也可能不是正确的,具体取决于实现(我自己还没有看到一个关于其 copy 方法的类,但是您永远不知道)

关于ios - 如何在 Objective-C 中使用 "copy"属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39607297/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com