使用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返回的是副本。要是想返回引用,有几种可行的方式:
- 把值类型包装成类:直接转成引用类型,自然就能返回引用。
- 指针操作:用
withUnsafeMutablePointer暴露底层存储,或者手动管理指针(不过这种方式要格外注意内存安全,尽量少用)。 - 放弃自动合成属性,手动用存储属性(相当于Swift里的iVar),然后写一个返回指针的计算属性:
class MyClass { private var _myStruct: MyCustomStruct = MyCustomStruct() var myStructPointer: UnsafeMutablePointer<MyCustomStruct> { return &_myStruct } }
总结一下
如果是引用类型,默认的getter已经返回引用了,根本不用自己写;但如果是值类型要返回引用,那确实得手动操作iVar,自己实现getter(或者返回指针的方法)——因为自动合成的属性getter对值类型只会返回副本。
内容的提问来源于stack exchange,提问作者user1733008
相关产品推荐
相关产品推荐

