3

在 C# 中,我们可以声明一个实例变量,readonly以指定它只能在声明期间或在其所属类的构造函数中作为赋值的主题:

private readonly int _myInt;

在 Objective-C 中,我知道可以将属性声明为只读,因此:

@property (readonly) int myInt;

但是,这等效于具有私有set访问器的 C# 属性,并且不保护相应的实例变量在初始化后不被“私有”重新分配。

有没有办法readonly在 Objective-C 中模仿 C# 修饰符的行为,这样实例变量只能在其包含类的初始化程序中分配(请注意 - 因为我希望能够在类初始化器,const修饰符不适合我的需要)?

如果这是不可能的,是否有概念上的原因导致这种行为在 Objective-C 中不合适?

4

1 回答 1

4

Objective-C 最终是一种基于 C 的、富指针的语言。因此,一旦您拥有指向任何给定对象的实例的指针,您就可以非常直接地随心所欲地进入并处理对象状态。如果没有 VM 或其他在进程中安全地强制执行只读内存的机制,任何此类机制都可能被击败。

因此,Objective-C 很久以前就选择了简单而不是错误的安全感。

如果不做一些非常恶心的事情,你就不能从类外重置 areadonly @property的后备存储的值;调用未在类的 public 中声明的方法@interface,弄乱运行时 API,或者更糟的事情。

所以,最终,这些特性并没有被完全追求,因为这样做会消耗大量的工程人力,不会真正增加语言的安全性,并且会使语言本身更加复杂(使用额外的关键字和要记住的规则)。

相关,请参阅此问题/答案: 为什么 Objective-C 不支持私有方法?

于 2013-05-30T23:57:57.400 回答