假设我以下列方式声明属性:
@property(nonatomic, strong, getter = isWorking) BOOL working;
然后我没有让要合成的属性,而是自己编写getter(并为其添加一些自定义逻辑)。
如果我按以下方式访问该属性会发生什么:
BOOL work = self.working;
是否仍在调用getter(以及我的自定义逻辑),或仅在我使用getter显式访问属性时调用它(BOOL work = self.isWorking;
)?
答案 0 :(得分:3)
哎呀。刚试了一下。显然我使用点符号太多了,并没有意识到它做了多少。 :P
#import "NSObject.h"
#include <stdio.h>
@interface Test : NSObject
@property (getter=myStuff) int stuff;
@end
@implementation Test
-(int)myStuff { return 42; }
-(void)setStuff:(int)value { /* don't care */ }
@end
int main() {
@autoreleasepool {
Test* test = [[Test alloc] init];
/* All these work... */
printf("test.stuff == %d\n", test.stuff);
printf("[test myStuff] == %d\n", [test myStuff]);
printf("test.myStuff == %d\n", test.myStuff);
/* but here, there's an exception */
printf("[test stuff] == %d\n", [test stuff]);
return 0;
}
}
当我编译它时(在Linux中使用clang),有两个关于遗漏-(int)stuff
的奇怪性的警告。输出看起来像
chao@chao-VirtualBox:~/code/objc$ ./a.out
test.stuff == 42
[test myStuff] == 42
test.myStuff == 42
: Uncaught exception NSInvalidArgumentException, reason: -[Test stuff]: unrecognized selector sent to instance 0x2367f38
chao@chao-VirtualBox:~/code/objc$
所以,嗯,是的。忽略下面一半的东西。 :P
self.working
只是 [self working]
(或[self setWorking:value]
的语法糖),如果你指定它的话。任何一个都会做同样的事情:返回[self isWorking]
的值,因为那是你定义的getter。
如果您想避开吸气剂,请尝试_working
或self->_working
(或任何您命名为ivar的物品)。否则,self.working
, 和[self working]
,[self isWorking]
(如果你感到勇敢,甚至是self.isWorking
)都应该给你相同的结果。