2015-06-28 2 views
0

В следующем коде я получаю '(null)' для второй строки на выходе, но не четвертый.Почему мой объектный объект Objective-C ведет себя по-разному с неявным getter?

MyClass.h

@interface MyClass : NSObject 
@property (readonly) NSString *foo; 
@property (getter=getBar, readonly) NSString *bar; 
@end 

main.m

@implementation MyClass 
- (NSString *)getFoo { return @"foo"; } 
- (NSString *)getBar { return @"bar"; } 
@end 

int main(int argc, const char * argv[]) { 
    @autoreleasepool {  
     MyClass *myClassInstance = [MyClass new]; 

     NSLog(@"%@", myClassInstance.getFoo); 
     NSLog(@"%@", myClassInstance.foo); 

     NSLog(@"%@", myClassInstance.getBar); 
     NSLog(@"%@", myClassInstance.bar); 
    } 
    return 0; 

выход

foo 
(null) 
bar 
bar 

Почему я вижу это?

+0

Я должен был сказать, я использую Xcode версии 6.3.2 (6D2105) –

ответ

2

Помните, что объективные C-геттеры - это просто имя свойства; foo в foo кейс. В этом случае нет связи между getFoo и foo, поэтому вы получаете доступ к базовому свойству через свой обычный getter. Он никогда не был установлен, так что это nil, который регистрируется как null.

В более позднем случае вы устанавливаете геттер для bar как getBar. Таким образом, при доступе к bar свойство оценивает указанную вами функцию геттера.

+0

А вот документация, которая подтверждает, что Адам говорит: https://developer.apple.com/library/ios/documentation/ Общий/Концептуальный/DevPedia-CocoaCore/AccessorMethod.html – socketwiz