即使我按姓名访问财产,财产吸气剂是否被召唤?

时间:2013-08-17 17:54:05

标签: objective-c properties

假设我以下列方式声明属性:

@property(nonatomic, strong, getter = isWorking) BOOL working;

然后我没有让要合成的属性,而是自己编写getter(并为其添加一些自定义逻辑)。

如果我按以下方式访问该属性会发生什么:

BOOL work = self.working;

是否仍在调用getter(以及我的自定义逻辑),或仅在我使用getter显式访问属性时调用它(BOOL work = self.isWorking;)?

1 个答案:

答案 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。

如果您想避开吸气剂,请尝试_workingself->_working(或任何您命名为ivar的物品)。否则,self.working [self working][self isWorking](如果你感到勇敢,甚至是self.isWorking)都应该给你相同的结果。