You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 22:52:28