为什么我的 Objective-C 点访问器与隐式 getter 的行为不同?

Why does my Objective-C dot accessor behaves differently with an implicit getter?

在下面的代码中,我在输出的第二行而不是第四行得到“(null)”。

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

为什么我会看到这个?

请记住 Objective C getter 只是 属性 的名称; foofoo 的情况下。在这种情况下,getFoofoo 之间没有任何关系,因此您可以通过其正常的 getter 访问基础 属性。它从未被设置,所以它是 nil,记录为 null

在后一种情况下,您将 bar 的 getter 设置为 getBar。因此,访问 bar 属性 会评估您指定的 getter 函数。