我有一个Objective-C类,其中包含一个C风格的结构。 我需要调用一个C函数指针传递给该对象构件(又名属性)。 对于我的生活,我无法弄清楚如何得到这个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
对象?
MyStruct mystruct
是私人在MyClass
,我认为当你myClass.myStruct
你只指的生成的访问方法,而不是实际的结构。
我不认为你可以从外部访问实例变量(结构在这种情况下),因为它是私人的。
为了得到一个指针MYSTRUCT实例变量,你需要写一个返回一个指向该实例变量的方法。
- (void)getMyStructPointer:(MyStruct **)outStruct {
*outstruct = &myStruct;
}
我真的不认为这是个好主意,但。 其他对象不应该被突变所对象的伊娃出从它下面,这是你可以用一个指针,你不能与返回值的结构的副本做的结构做的唯一的事情。
这个问题本身一个演示功能缺乏至少术语的理解。
属性是由通过物体,即获取和设置方法,在这种情况下公开的两个(或一个为只读)的方法的接口:
- (MyStruct) myStruct;
- (void) setMyStruct: (MyStruct) newMyStruct;
这是没有意义谈“以某物业的地址”。
你可以把一个实例变量(伊娃)的地址。 在这种情况下,你有一个名为MYSTRUCT伊娃,你可以利用它的地址与&mystruct
MyClass中的方法。 由于它被标记@protected
(默认设置),则可以使用利用它的地址在子类中&self->mystruct
。 如果选中它@public
,那么你可以使用利用它的地址&myobj->mystruct
。 这是一个可怕的想法,你真的应该重新考虑确实如此,但你可以做到这一点。
如果你只是想伊娃的一段短暂的目的地址(例如,如果MYSTRUCT很大),你可以做到这一点,但它是非常不寻常的,而且你会更好写一个明确命名的方法,如:
- (MyStruct*) getAddressForSettingMyStruct;
如果是单纯的阅读,更好的办法是使用const的MYSTRUCT *。
经常有不错的理由这样做原来的职位是要求,因为那是什么Objective-C的应用程式往往与C到工作/ C ++ API,可采取指针结构和类型相似,但在Cocoa程序,你会经常想存储在Objective-C类这样的数据进行数据管理,收集在数组和字典等
尽管这个问题已经运行了一段时间我看不出明确的答案,那就是:你可以有一个返回的支持下你的财产数据的地址的方法,但这种方法不使用“自我”,或者将通过访问,但仍不能正常工作。
- (const MyStruct*) getMyStructPtr
{
return &mystruct;
}
请注意,我使用的财产申报从OP,而不是引用它作为self.mystruct
,这将产生一个编译器错误(因为调用合成getter方法)。