object-c-dot语法与getter =的方法语法

我不知道这个问题有多少使用,但对我来说似乎很有趣

我认为使用property / synthesize语句等价于我创建getter / setter.因此

// .h
@property (nonatomic) BOOL on;

// .m
@synthesize on = _on;

// In my mind synthesizes the following methods

// - (BOOL)on;
// - (void)setOn:(BOOL)on;

但是,如果我将声明更改为以下内容:

                              v
@property (nonatomic, getter=isOn) BOOL on;

@synthesize on = _on;

// In my mind synthesizes the following

// - (BOOL)isOn;
// - (void)setOn:(BOOL)on;

然后给出上面我覆盖了getter,所以我知道什么时候被调用:

- (BOOL)isOn;
{
    NSLog(@"I was called");
    return _on;
}

现在在一个实例(myClass)上调用以下内容导致:

NSLog(@"%d", [myClass isOn]);

//=> 2012-02-09 22:18:04.818 Untitled[1569:707] I was called
//=> 2012-02-09 22:18:04.820 Untitled[1569:707] 1

NSLog(@"%d", myClass.isOn);

//=> 2012-02-09 22:18:24.859 Untitled[1599:707] I was called
//=> 2012-02-09 22:18:24.861 Untitled[1599:707] 1

NSLog(@"%d", myClass.on);         // This is the one I didn't expect to work

//=> 2012-02-09 22:18:55.568 Untitled[1629:707] I was called
//=> 2012-02-09 22:18:55.570 Untitled[1629:707] 1

我一直假设,如果我在这个意义上使用一个属性,使用getter / setter的点语法是非常有效的

myClass.isOn;
myClass.on = on;

从另一个question建议,当使用点语法我应该使用这样的属性名称:

myClass.on   // Correct
myClass.isOn // Incorrect

虽然这样做似乎略微不合逻辑,因为我知道没有底层方法 – (BOOL),而是映射到 – (BOOL)isOn

我的问题是(使用后面的例子)

>这是一个bug,或者我的myClass.on真的要默默地改为调用 – (BOOL)isOn
>语义上我正在访问状态不调用行为,所以我目前使用的点语法是否正确? (例如myClass.isOn)

更新

虽然没有人明确表示,我有理由认为使用.isOn是不好的形式,因为无论在引擎盖下同样的方法被调用,语义上isOn提出一个问题,这是更多的行为而不是状态.

然而,我还不清楚“魔术”布线在哪里,将myClass.on调用到[myClass isOn]

更新2

在查看文档之后,我在Declared Properties发现了一些这个部分.使用下面的代码我可以检查一个类的属性:

id MyClass = objc_getClass("MyClass");
unsigned int outCount, i;

objc_property_t *properties = class_copyPropertyList(MyClass, &outCount);
for (i = 0; i < outCount; i++) {
    objc_property_t property = properties[i];
    NSLog(@"Name: %s, attributes: %s\n", property_getName(property), property_getAttributes(property));
}

//=> 2012-02-10 07:10:28.333 Untitled[934:707] Name: on, attributes: Tc,GisOn,V_on

所以我们有以下属性:

> name = on
> type = char(Tc)
> getter = isOn(GisOn)
> variable = _on(V_on)

所有这些信息在运行时可用,这样的问题是这个查询在运行时或编译时完成,像一些答案建议?

However I am still unclear on where the “magic” wiring goes on that turns calls to myClass.on into [myClass isOn]

在获取上下文中编译obj.name时,逻辑肯定如下:

if(there is an accessible @property for name in scope)
{
   if(there is a custom getter specified)
      compile "[obj customGetter]"
   else
      compile "[obj name]"
}
else if (there is an an accessible instance method name in scope)
   compile "[obj name]"
else
{
   compile "[obj name]"
   warn obj may not respond to name
}

语言/执行环境可以处理自定义getter名称的其他方法,但是由于Obj-C将声明放在头文件(这是公共的)中,以上是对自定义getter逻辑执行的位置的一个很好的猜测 – 编译时呼叫站点.

翻译自:https://stackoverflow.com/questions/9220028/dot-syntax-vs-method-syntax-with-getter

转载注明原文:object-c-dot语法与getter =的方法语法