我有一个Objective-C类,它包含一个C风格的结构。我需要调用一个C函数传递一个指向这个对象成员的指针(a.k.a. property)。对于我的生活,我无法弄清楚如何获得这个C结构的地址。使用传统的&
运算符来获取地址,我得到了LValue编译器错误。
typedef struct _myStruct
{
int aNumber;
}MyStruct, *pMyStruct;
@interface MyClass : NSObject {
MyStruct mystruct;
}
@property (readwrite) MyStruct myStruct;
@end
以下代码导致编译器错误:
MyClass* myClass = [[MyClass alloc] init];
MyStruct* p = &(myClass.myStruct);
如何获取指向myStruct
对象的myClass
成员的指针?
答案 0 :(得分:2)
MyStruct mystruct
在MyClass
中是私有的,我假设当您执行myClass.myStruct
时,您只是引用生成的访问器方法而不是实际结构。
我认为你不能从外部访问实例变量(在这种情况下是结构),因为它是私有的。
答案 1 :(得分:2)
要获取指向myStruct实例变量的指针,您需要编写一个返回指向该实例变量的指针的方法。
- (void)getMyStructPointer:(MyStruct **)outStruct {
*outstruct = &myStruct;
}
但是,我并不认为这是一个好主意。其他对象不应该从它下面改变该对象的ivar,并且这是你可以用指向结构的指针做的唯一的事情,你不能用value返回的结构的副本。
答案 2 :(得分:2)
问题本身表明至少缺乏对术语的理解。
属性是由对象公开的两个(或一个readonly方法)方法组成的接口,即getter和setter方法,在这种情况下:
- (MyStruct) myStruct;
- (void) setMyStruct: (MyStruct) newMyStruct;
谈论“取得财产的地址”是没有意义的。
您可以获取实例变量(ivar)的地址。在这种情况下,您有一个名为mystruct的ivar,您可以在MyClass的方法中使用&mystruct
的地址。由于它标记为@protected
(默认情况下),因此您可以使用&self->mystruct
在子类中获取它的地址。如果您将其标记为@public
,则可以使用&myobj->mystruct
获取地址。这是一个可怕的想法,你应该真的重新考虑这个,但你可以做到。
如果你只是希望ivar的地址用于一些短暂的目的(例如,如果MyStruct很大)你可以这样做,但这将是非常不寻常的,你最好写一个明确命名的方法像:
- (MyStruct*) getAddressForSettingMyStruct;
如果它只是只读,那么更好的方法是使用const MyStruct *。
答案 3 :(得分:2)
由于Objective-C应用程序通常必须使用指向结构和类似类型的指针的C / C ++ API,因此通常有很好的理由去做原始帖子所要求的内容,但是在Cocoa应用程序中你会通常希望将这些数据存储在Objective-C类中,以进行数据管理,数组和字典中的收集等。
虽然这个问题已经存在了一段时间但我没有看到明确的答案,即:你可以有一个方法来返回支持你的属性的数据的地址,但在那个方法中不要使用“self “或者它会通过存取器而仍然不起作用。
- (const MyStruct*) getMyStructPtr
{
return &mystruct;
}
请注意,我正在使用OP中声明的属性,但未将其引用为self.mystruct
,这将生成编译器错误(因为它会调用合成的getter方法)。