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

使用Objective C++能否创建类型为C++类且getter返回引用的属性?

嘿,这个问题我刚好有实操经验!其实得看你处理的是值类型还是引用类型,还有具体用的语言(不过你提到了iVar,大概率是Objective-C或者Swift里的手动实例变量场景),分情况给你捋清楚:

先聊Objective-C的场景
  • 如果你的属性是引用类型(比如NSString、NSArray这类NSObject子类):默认@property生成的getter本来就返回对象的引用(毕竟Objective-C里对象都是指针),你拿到的就是原对象,根本不是副本——除非你给@property加了copy修饰符,那getter才会返回副本。这种情况完全不用自己写getter,去掉copy就行。
  • 如果你的属性是值类型(比如自定义结构体、CGPoint、NSInteger这类):默认@property的getter会返回值的副本。要是想让外部直接拿到底层iVar的引用(也就是修改返回值能直接改变原iVar),那确实得放弃@property的自动合成,手动写getter和setter直接操作iVar:
    // 类扩展里声明iVar
    @interface MyClass () {
        MyCustomStruct _myStruct;
    }
    @end
    
    @implementation MyClass
    // 自定义getter返回iVar的指针(引用)
    - (MyCustomStruct *)myStruct {
        return &_myStruct;
    }
    
    // 自定义setter赋值iVar
    - (void)setMyStruct:(MyCustomStruct)myStruct {
        _myStruct = myStruct;
    }
    @end
    
    这样外部调用[obj myStruct]拿到的就是指向底层iVar的指针,修改指针指向的内容会直接同步到原iVar上。
再说说Swift的场景
  • 如果是类类型:本身就是引用语义,存储属性的getter返回的就是原对象的引用,完全不用额外操作。
  • 如果是值类型(struct、enum):默认是值语义,getter返回的是副本。要是想返回引用,有几种可行的方式:
    1. 把值类型包装成类:直接转成引用类型,自然就能返回引用。
    2. 指针操作:用withUnsafeMutablePointer暴露底层存储,或者手动管理指针(不过这种方式要格外注意内存安全,尽量少用)。
    3. 放弃自动合成属性,手动用存储属性(相当于Swift里的iVar),然后写一个返回指针的计算属性:
      class MyClass {
          private var _myStruct: MyCustomStruct = MyCustomStruct()
      
          var myStructPointer: UnsafeMutablePointer<MyCustomStruct> {
              return &_myStruct
          }
      }
      
总结一下

如果是引用类型,默认的getter已经返回引用了,根本不用自己写;但如果是值类型要返回引用,那确实得手动操作iVar,自己实现getter(或者返回指针的方法)——因为自动合成的属性getter对值类型只会返回副本。

内容的提问来源于stack exchange,提问作者user1733008

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:10:58