如何在Objective-C中实施只读IVAR?

如何在Objective-C中实施只读IVAR?,objective-c,state,Objective C,State,在我看来,这种状态类似于“运动部件”。运动部件越多,出错的机会就越多。我对国家持敌对态度。按照优先顺序,我希望状态为: 不存在 私有只读 私有和公共只读 私有读/写&公共只读 公共读/写 状态存储在ivar中(无论是通过@synthsize显式声明还是隐式声明)。为了允许公众访问状态,我们提供了访问器方法。用代码表达上述意图: 不要写任何代码 使用ivar并依靠代码注释来防止(不是最佳的!) 与2加上一个公共getter相同 ivar加上一个公众人物 4+公共设定器 如何更好地解决案例2?首先

在我看来,这种状态类似于“运动部件”。运动部件越多,出错的机会就越多。我对国家持敌对态度。按照优先顺序,我希望状态为:

  • 不存在
  • 私有只读
  • 私有和公共只读
  • 私有读/写&公共只读
  • 公共读/写
  • 状态存储在ivar中(无论是通过@synthsize显式声明还是隐式声明)。为了允许公众访问状态,我们提供了访问器方法。用代码表达上述意图:

  • 不要写任何代码
  • 使用ivar并依靠代码注释来防止(不是最佳的!)
  • 与2加上一个公共getter相同
  • ivar加上一个公众人物
  • 4+公共设定器
  • 如何更好地解决案例2?

    首先

    //this is the guts of the solution. It is basically uses pointers to cast away the const.
    #define EMK_INIT_READONLY_IVAR(ivar, value) (*(typeof(value) *)(&ivar) = value)
    
    
    @interface Foo : NSObject
    @end
    
    
    
    @implementation
    {
        id const _bar;
        const NSInteger _baz;
    }
    
    
    
    -(id)init
    {
        self = [super init];
        if (self != nil)
        {
            //we could use KVC to set object values, but it's preferable to have a mechanism 
            //which is identical for object and scalar values.
            EMK_INIT_READONLY_IVAR(_bar, @"I got a brand new combine harvester, oh-ah, oh-ah!");
            EMK_INIT_READONLY_IVAR(_baz, 0xDEADBEEF);
        }
        return self;
    }
    
    @end
    
    IVAR/财产

    IVAR和属性不可互换。它们不是一回事。属性可以由实例变量“支持”,但这就是关系结束的地方

    首先,没有显式的实例变量。为了达到第2点(或尽可能接近),定义一个只读属性并像这样@synthesis它

    @synthesize myProperty = myProperty_;
    
    -init
    中将实例变量(myProperty_u)初始化为所需的值,然后在.m文件中不再为其赋值。如果您不相信自己无法避免在
    -init
    之后在该.m文件(后面的下划线用于帮助您)中分配它,您可以
    #定义它,以便在使用时导致错误,例如

    #define myProperty_ someDefinitelyNonExistingIdentifier
    

    抱歉,但是-1,修改常量限定变量在C99中是未定义的行为(第6.7.3节第5点)。此外,
    typeof
    是非标准扩展。如果试图通过使用具有非常量限定类型的左值来修改使用常量限定类型定义的对象,则该行为是未定义的。如果试图通过使用具有非易失性限定类型的左值来引用使用易失性限定类型定义的对象,则该行为是未定义的。“这是引语。第一部分正是你试图通过转换为非常量类型来做的事情。在重读之后,我想我的问题可能会非常清楚。我从高层次的角度考虑状态,然后一路跳到实现细节。我改进了这个问题。