gpt4 book ai didi

objective-c - 使用点符号调用属性的 getter 方法

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

我在使用 Objective-C 属性 时遇到了一些困难。我展示一段代码只是为了解释我的疑问:

啊啊

@interface A : NSObject
@property (nonatomic,getter = isChosen) BOOL chosen;
@end

ma​​in.m

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);

输出

1. myClass.chosen = 1
2. myClass.chosen = 0
3. myClass.chosen = 0
4. myClass.chosen = 0

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

我想知道使用点符号语法调用 getter 方法是否被认为是好的做法,是否只有我觉得很奇怪。显然只有当您更改 getter property 声明中命名,否则 NSLog 2 和 4 相同。

最佳答案

点语法是访问器方法调用的简洁替代方法
除了进行显式访问器方法调用外,Objective-C 还提供了另一种点语法来访问对象的属性。

点语法允许您像这样访问属性:

NSString *firstName = somePerson.firstName;
somePerson.firstName = @"Johnny";

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

使用 somePerson.firstName 获取值与使用 [somePerson firstName] 相同使用 somePerson.firstName = @"Johnny"设置值与使用 [somePerson setFirstName:@"Johnny"] 相同这意味着通过点语法的属性访问也由属性属性控制。如果一个属性被标记为只读,如果您尝试使用点语法设置它,您将得到一个编译器错误。

Have a look at this

从变量中读取,点号和直接读取是一样的。在您的例子中,myClass.chosen[myClass isChosen] 相同。在这里你刚刚为你的 setter/getter 分配了一个名字。因此,不是调用 [myClass chosen],而是调用 [myClass isChosen]。当您分配给变量时,差异就会出现。也就是说,

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

编辑

对不起,我之前没听懂你的意思。
点 (.) 不仅是 setter 的快捷方式,也是 getter 的快捷方式。您也可以使用点作为 setter/getter 。没有问题,这也不是不好的做法。来自 Obj-C 2.0 programming guide ,“您可以使用点语法来调用访问器方法,使用与访问结构元素相同的模式。点语法纯粹是“语法糖””。请注意,它说的是访问器方法,而不仅仅是 setter 。

编辑2
在搜索您的答案时,我发现了这个..想与您分享..

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

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

希望这对你有帮助……:)

关于objective-c - 使用点符号调用属性的 getter 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20881033/

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