gpt4 book ai didi

objective-c - 带 getter= 的点语法与方法语法

转载 作者:太空狗 更新时间:2023-10-30 03:22:06 24 4
gpt4 key购买 nike

我不确定这个问题有多大用处,但我觉得它很有趣......

我认为使用 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)on 它被映射到 - (BOOL)isOn

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

  • 这是一个错误还是真的应该将 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

所以我们有以下属性:

  • 姓名=上
  • type = char (Tc)
  • getter = isOn (GisOn)
  • 变量 = _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 将声明放在 header 中(这是公共(public)的),以上是关于执行自定义 getter 逻辑的位置的一个很好的猜测- 编译调用站点时。

关于objective-c - 带 getter= 的点语法与方法语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9220028/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com