自定义getter后,如何直接用属性名访问Objective-C的@property而非self.属性名?
问题解析与解决方案
问题原因
原来的代码中,@synthesize foo;会自动创建一个与属性同名的实例变量foo,直接写foo时是直接读取这个实例变量的值。当你自定义了foo的getter方法后,你不再手动给这个实例变量赋值(原有的foo = @"bar"逻辑已移除),所以直接访问foo会拿到未初始化的nil;而self.foo是显式调用getter方法,能正确返回Swift代码提供的值。
简洁解决方案
只需要修改@synthesize的声明,将属性和实例变量的名字区分开:
// SomeObject.m @implementation SomeObject { ... } @synthesize foo = _foo; // 指定实例变量名为_foo,而非foo - (NSString *)foo { return [SwiftObject getFoo]; } - (void)otherMethod { NSLog(@"Foo: %@", foo); // 现在会自动调用getter,返回"swiftBar" NSLog(@"Foo: %@", self.foo); // 同样返回"swiftBar" } @end
原理说明
使用@synthesize foo = _foo;后,编译器会创建名为_foo的实例变量,不再生成同名的foo实例变量。此时代码中直接写foo时,编译器找不到对应的实例变量,会自动将其解析为对foo属性的getter调用(等同于self.foo),所有原有直接访问foo的代码都会自动调用你自定义的getter,无需逐个修改。
注意:如果原有代码中存在直接给
foo赋值的逻辑,需要改为给_foo赋值,但你当前场景已经不需要手动赋值,所以不会有影响。
内容的提问来源于stack exchange,提问作者Andrei Herford
相关产品推荐
相关产品推荐

