为什么我的 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 只是 属性 的名称; foo
在 foo
的情况下。在这种情况下,getFoo
和 foo
之间没有任何关系,因此您可以通过其正常的 getter 访问基础 属性。它从未被设置,所以它是 nil
,记录为 null
。
在后一种情况下,您将 bar
的 getter 设置为 getBar
。因此,访问 bar
属性 会评估您指定的 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 只是 属性 的名称; foo
在 foo
的情况下。在这种情况下,getFoo
和 foo
之间没有任何关系,因此您可以通过其正常的 getter 访问基础 属性。它从未被设置,所以它是 nil
,记录为 null
。
在后一种情况下,您将 bar
的 getter 设置为 getBar
。因此,访问 bar
属性 会评估您指定的 getter 函数。