Objective-C中等价于C#中readonly变量的是什么?

3

在C#中,我们可以将实例变量声明为readonly,以指定它只能在声明或所属类的构造函数中被赋值:

private readonly int _myInt;

在Objective-C中,我了解到可以将属性声明为只读,如下所示:
@property (readonly) int myInt;

然而,这等同于具有私有set存取器的C#属性,并且不会保护相应的实例变量免受初始化后被“私下”重新分配的影响。
是否有一种方法可以在Objective-C中模拟C#的readonly修饰符,使得实例变量只能在其包含类的初始化程序中分配(请注意,因为我想在类初始化程序期间分配变量,所以const修饰符不适合我的需求)?
如果这不可能,是否有概念上的原因说明这种行为在Objective-C中不合适?
1个回答

4

Objective-C 是一种基于 C 的指针丰富的语言。因此,一旦你拥有了指向任何给定对象实例的指针,就可以直接地随意更改对象状态。如果没有虚拟机或其他机制在进程内安全地强制只读内存,则所有这些机制都可能被攻破。

因此,Objective-C 很早就选择了简单性而不是虚假的安全感。

你不能从类外部重置只读属性的后备存储的值,除非做一些相当卑鄙的事情;调用未在类的公共接口中声明的方法、搞乱运行时 API 或更糟糕的事情。

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

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


这是一个很棒的句子:Objective-C 很久以前就选择了简单而不是虚假的安全感。 - Bruno Koga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接