用点表示法调用属性的getter方法

Gia*_*nzi 5 getter properties objective-c accessor

我在使用Objective-C属性时遇到了一些困难。.我正在显示一段代码来解释我的疑问:

@interface A : NSObject
@property (nonatomic,getter = isChosen) BOOL chosen;
@end
Run Code Online (Sandbox Code Playgroud)

主目录

A *myClass = [[A alloc]init];

myClass.chosen = YES;
NSLog(@"1. myClass.chosen = %hhd", myClass.chosen);
myClass.chosen = NO;
NSLog(@"2. myClass.chosen = %hhd", myClass.chosen);          
NSLog(@"3. myClass.chosen = %hhd", [myClass isChosen]);      
NSLog(@"4. myClass.chosen = %hhd", myClass.isChosen);
Run Code Online (Sandbox Code Playgroud)

输出值

1. myClass.chosen = 1
2. myClass.chosen = 0
3. myClass.chosen = 0
4. myClass.chosen = 0
Run Code Online (Sandbox Code Playgroud)

一切都清楚对我来说,除了代码,在那里我得到的值的最后一行选择属性myClass.isChosen:我理解的点语法myClass.chosen,因为编译器将其转换在消息符号语法[myClass isChosen],但我真的不明白为什么myClass.isChosen可行,或者更好,我认为编译器再次将其转换为消息表示法,但对我来说似乎有点奇怪。

我想知道使用点表示法语法调用getter方法是否被认为是一种好习惯,并且似乎只对我来说很奇怪。.显然,只有在属性声明中更改getter名称时才会注意到这一点,否则会显示NSLog 2和4相同。

Pri*_*wal 4

点语法是访问器方法调用的简洁替代方案
\n除了进行显式访问器方法调用之外,Objective-C 还提供了替代点语法来访问对象\xe2\x80\x99s 属性。

\n\n

点语法允许您访问如下属性:

\n\n
NSString *firstName = somePerson.firstName;\nsomePerson.firstName = @"Johnny";\n
Run Code Online (Sandbox Code Playgroud)\n\n

点语法纯粹是访问器方法调用的方便包装。当您使用点语法时,仍然可以使用上面提到的 getter 和 setter 方法来访问或更改属性:

\n\n

使用 somePerson.firstName 获取值与使用 [somePerson firstName] 相同\n使用 somePerson.firstName = @"Johnny" 设置值与使用 [somePerson setFirstName:@"Johnny"] 相同\n这意味着通过点语法也由属性属性控制。如果某个属性被标记为只读,则在尝试使用点语法设置它时,\xe2\x80\x99 将收到编译器错误。

\n\n

看看这个

\n\n

要读取变量,点符号和直接读取是相同的。在你的情况下,myClass.chosen与 相同[myClass isChosen]。在这里,您刚刚为您的 getter 指定了一个名称。因此[myClass chosen],您不是在打电话,而是在打电话[myClass isChosen]。当您分配给变量时,差异就会出现。那是,

\n\n

[self setVar:foo]self.var=foo与\n 相同,但是,\nself->var= foo;与\n不同[self setVar:foo]
,直接赋值给变量不会泄漏内存,同时self.var会调用访问器方法,因此会增加保留计数。如果需要更多信息,请告诉我

\n\n

编辑

\n\n

抱歉,我之前没听懂你的意思。
\n点 (.) 不仅是 setter 的快捷方式,也是 getter 的快捷方式。您也可以使用点作为 getter。没有问题,这也不是不好的做法。从Obj-C 2.0 编程指南中,“您可以使用点语法来调用访问器方法,使用与访问结构元素相同的模式。点语法纯粹是 \xe2\x80\x9c 语法糖\xe2\x80\x9d”。请注意,它说的是访问器方法,而不仅仅是设置器。

\n\n

编辑2
\n在寻找你的答案时,我发现了这个..想与你分享..

\n\n

当你有一个成员变量 on 时,并且该变量的 getter 称为 isOn ,那么 .on 和 .isOn 是两种截然不同的东西。通过使用 getter(也可能是 setter),您将遵守“信息隐藏”承诺,而通过直接访问成员变量则不会。Cocoa 不会强制执行这些事情,因为它依赖于约定。由您决定哪种方式适合您。考虑到惯例,您必须坚持使用 setter 和 getter - 不管您给它们起什么名字。

\n\n

“总的来说,我认为这是对语言的一个相当愚蠢的补充,因为我们已经有了发送消息的语法。”\n-Aaron Hillegass(Mac OSX 的 Cocoa 编程,第三版)

\n\n

希望这个能帮助你\xe2\x80\xa6 :)

\n