0

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

  1. 不存在
  2. 私有只读
  3. 私有和公共只读
  4. 私有读/写和公共只读
  5. 公共读/写

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

  1. 不要写任何代码
  2. 使用 ivar 并依靠代码注释来防止(不是最佳的!)
  3. 与 2 加一个公共吸气剂相同
  4. ivar 加上一个公共吸气剂
  5. 4加公共二传手

如何更好地解决案例 2?

4

2 回答 2

0

首先,

伊瓦尔/财产

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

首先,没有明确的实例变量。要实现第 2 点(或尽可能接近),请定义一个只读属性并像这样@synthesize

@synthesize myProperty = myProperty_;

将实例变量 (myProperty_) 初始化为您想要的值-init,然后不要在 .m 文件中再次分配给它。如果您不相信自己不能避免在那个 .m 文件中分配它(尾随下划线可以帮助您),-init那么如果使用它可能#define会导致错误,例如

#define myProperty_ someDefinitelyNonExistingIdentifier
于 2012-06-26T10:29:16.733 回答
-1
//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
于 2012-06-26T09:35:09.743 回答