cocoa - 使用 NSCopying 复制私有(private)实例变量的最佳实践

标签 cocoa instance-variables nscopying

我可能在这里遗漏了一些明显的东西,但我正在我的一个对象上实现 NSCopying。该对象具有不通过 getter 公开的私有(private)实例变量,因为它们不应该在对象外部使用。

在我的 copyWithZone: 实现中,我需要分配/初始化新实例,而且还设置其状态以匹配当前实例。显然,我可以从 copyWithZone: 内部访问当前私有(private)状态,但无法将其设置到新对象中,因为没有该状态的访问器。

是否有一种标准方法可以解决这个问题,同时仍然保持数据隐私完整?

谢谢。

最佳答案

首先,你应该始终有 setter/getter ,即使它们是私有(private)的。你的对象应该只使用访问器访问它自己的ivars(极少数情况除外)。这将为您省去很多内存管理的麻烦。

其次,Alex 建议使用 -> 是一种标准方法,尽管这违反了上面的 getter 规则。该规则有少数异常(exception)情况,复制就是其中之一。在这里使用私有(private) setter 仍然是合理的(我以前专门这样做),但由于各种原因,我发现使用 -> 通常会更干净。

要非常小心地确保内存管理正确。如果您需要调用 [super copyWithZone:],那么您还应该了解 NSCopyObject() 的复杂性以及即使您不使用它也会对您产生怎样的影响你自己吧。我在 "NSCopyObject() considered harmful." 中详细讨论了这一点

关于cocoa - 使用 NSCopying 复制私有(private)实例变量的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2567385/

相关文章:

iphone - 如何从 UIWebView 获取最后的 HTTP 状态代码?

android - 在 StartActivity 之后调用类方法

iphone - 复制只读 NSMutableArray 的正确方法

iphone - 在类中启用 NSCopying 协议(protocol)

objective-c - setApplicationIconImage 在 10.10 中已弃用 - 替代方案?

ios - UITextField 删除 "..."

linux - 使用 Linux 脚本和 Cron 定期比较变量

java - 我正在 Java 中处理静态变量和实例变量,我无法理解代码的输出

iphone - 为什么 UIView (或其子类)不采用 NSCopying 协议(protocol)?

swift - 如何控制/覆盖 NSTableView/NSOutlineView 发送的通知