获取Objective-c属性的地址(这是一个C结构)

时间:2009-07-09 05:43:48

标签: objective-c lvalue declared-property address-operator

我有一个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成员的指针?

4 个答案:

答案 0 :(得分:2)

MyStruct mystructMyClass中是私有的,我假设当您执行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方法)。