2013-08-17 74 views
1

比方说,我在下面的方式财产申报:即使按名称访问属性,属性获取器是否被调用?

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

然后,而不是具有属性合成我写的吸附剂,我自己(和添加一些自定义逻辑的话)。

,如果我在下面的方法访问属性会发生什么:

BOOL work = self.working; 

是吸气(也有我的定制逻辑),还叫呢,还是叫我使用getter明确访问属性(BOOL work = self.isWorking; )?

+1

类似:http://stackoverflow.com/questions/9220028/dot-syntax-vs-method-syntax-with-getter。 –

回答

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中),有关于丢失-(int)stuff的奇怪两次警告。输出看起来像

[email protected]:~/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 
[email protected]:~/code/objc$ 

所以,恩,是的。忽略一半以下的东西。 :P


self.working仅仅是[self working]语法糖(或[self setWorking:value]如果你分配给它)。任何一个都会执行相同的操作:返回[self isWorking]的值,因为这是您定义的吸气剂。

如果你想避开吸气剂,试试_workingself->_working(或任何你命名的伊娃)。否则,self.working,[self working],[self isWorking](甚至如果你感觉很勇敢的话self.isWorking)都应该给你相同的结果。

+0

我不想避免它 - 我希望它总是被称为。我知道'self.working'只是'[self working]的语法糖',但是我的getter没有被命名为'working',而是'isWorking'。请再次仔细阅读我的问题。 – drasto

+0

对于谁低估了这一点:请不要downvote有帮助的答案,如这一个。这是非常正确的,并直接回应这个问题。 – jlehr

+0

换句话说,我的问题是,'[self working]'是否调用我的自定义getter方法,名为'isWorking',或者它是否在不调用getter(是我的自定义逻辑授予执行权限?)的情况下访问ivar('_working')。 – drasto