相当于c#只读变量的Objective-C
本文关键字:Objective-C 变量 只读 相当于 | 更新日期: 2023-09-27 18:16:04
在c#中,我们可以将实例变量声明为readonly
,以指定它只能在声明期间或在其所属类的构造函数中作为赋值的主题:
private readonly int _myInt;
在Objective-C中,我理解属性可以声明为只读:
@property (readonly) int myInt;
然而,这相当于一个带有私有set
访问器的c#属性,并且不保护相应的实例变量在初始化后不被"私有"重新赋值。
是否有一种方法来模仿c#的readonly
修饰符在Objective-C中的行为,这样一个实例变量只能在其包含类的初始化器中分配(注意-因为我想能够在类初始化器期间分配给变量,const
修饰符不适合我的需要)?
如果这是不可能的,是否有一个概念上的原因,为什么这种行为在Objective-C中不合适?
Objective-C最终是一种基于C的、指针丰富的语言。因此,一旦您拥有了指向任何给定对象实例的指针,您就可以非常直接和随意地访问和处理对象状态。如果没有虚拟机或其他机制在进程中安全执行只读内存,任何这样的机制都可能失败。
因此,Objective-C很早以前就选择了简单性而不是虚假的安全感。
你不能重置readonly
@property
的备份存储的值从类之外没有做一些相当恶心的事情;调用没有在类的公共@interface
中声明的方法,扰乱运行时api,或者更糟的事情。
因此,最终,这样的特性没有被追求,因为这样做会消耗大量的工程人力,不会真正增加语言的安全性,并且会使语言本身更加复杂(需要记住额外的关键字和规则)。
相关,参见这个问题/回答:为什么Objective-C不支持私有方法?