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相同。
点语法是访问器方法调用的简洁替代方案
\n除了进行显式访问器方法调用之外,Objective-C 还提供了替代点语法来访问对象\xe2\x80\x99s 属性。
点语法允许您访问如下属性:
\n\nNSString *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]
。当您分配给变量时,差异就会出现。那是,
[self setVar:foo]
self.var=foo
与\n 相同,但是,\nself->var= foo;
与\n不同[self setVar:foo]
,直接赋值给变量不会泄漏内存,同时self.var
会调用访问器方法,因此会增加保留计数。如果需要更多信息,请告诉我
编辑
\n\n抱歉,我之前没听懂你的意思。
\n点 (.) 不仅是 setter 的快捷方式,也是 getter 的快捷方式。您也可以使用点作为 getter。没有问题,这也不是不好的做法。从Obj-C 2.0 编程指南中,“您可以使用点语法来调用访问器方法,使用与访问结构元素相同的模式。点语法纯粹是 \xe2\x80\x9c 语法糖\xe2\x80\x9d”。请注意,它说的是访问器方法,而不仅仅是设置器。
编辑2
\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