得到一个Objective-C属性的地址(这是一个C结构)(Get the address of a

2019-06-25 10:54发布

我有一个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对象?

Answer 1:

MyStruct mystruct是私人在MyClass ,我认为当你myClass.myStruct你只指的生成的访问方法,而不是实际的结构。

我不认为你可以从外部访问实例变量(结构在这种情况下),因为它是私人的。



Answer 2:

为了得到一个指针MYSTRUCT实例变量,你需要写一个返回一个指向该实例变量的方法。

- (void)getMyStructPointer:(MyStruct **)outStruct {
    *outstruct = &myStruct;
}

我真的不认为这是个好主意,但。 其他对象不应该被突变所对象的伊娃出从它下面,这是你可以用一个指针,你不能与返回值的结构的副本做的结构做的唯一的事情。



Answer 3:

这个问题本身一个演示功能缺乏至少术语的理解。

属性是由通过物体,即获取和设置方法,在这种情况下公开的两个(或一个为只读)的方法的接口:

- (MyStruct) myStruct;
- (void) setMyStruct: (MyStruct) newMyStruct;

这是没有意义谈“以某物业的地址”。

你可以把一个实例变量(伊娃)的地址。 在这种情况下,你有一个名为MYSTRUCT伊娃,你可以利用它的地址与&mystruct MyClass中的方法。 由于它被标记@protected (默认设置),则可以使用利用它的地址在子类中&self->mystruct 。 如果选中它@public ,那么你可以使用利用它的地址&myobj->mystruct 。 这是一个可怕的想法,你真的应该重新考虑确实如此,但你可以做到这一点。

如果你只是想伊娃的一段短暂的目的地址(例如,如果MYSTRUCT很大),你可以做到这一点,但它是非常不寻常的,而且你会更好写一个明确命名的方法,如:

- (MyStruct*) getAddressForSettingMyStruct;

如果是单纯的阅读,更好的办法是使用const的MYSTRUCT *。



Answer 4:

经常有不错的理由这样做原来的职位是要求,因为那是什么Objective-C的应用程式往往与C到工作/ C ++ API,可采取指针结构和类型相似,但在Cocoa程序,你会经常想存储在Objective-C类这样的数据进行数据管理,收集在数组和字典等

尽管这个问题已经运行了一段时间我看不出明确的答案,那就是:你可以有一个返回的支持下你的财产数据的地址的方法,但这种方法不使用“自我”,或者将通过访问,但仍不能正常工作。

- (const MyStruct*) getMyStructPtr
{
    return &mystruct;
}

请注意,我使用的财产申报从OP,而不是引用它作为self.mystruct ,这将产生一个编译器错误(因为调用合成getter方法)。



文章来源: Get the address of an Objective-c property (which is a C struct)