7

我有一个包含 C 样式结构的 Objective-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

4

4 回答 4

4

考虑到 Objective-C 应用程序通常必须使用 C/C++ API 来获取指向结构和类似类型的指针,因此通常有很好的理由去做原始帖子所要求的事情,但在 Cocoa 应用程序中,您经常想要将此类数据存储在 Objective-C 类中,用于数据管理、数组和字典中的收集等。

虽然这个问题已经提出了一段时间,但我没有看到明确的答案,那就是:你可以有一个方法来返回支持你的属性的数据的地址,但是在那个方法中不要使用“self”或者它将通过访问器,但仍然无法正常工作。

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

请注意,我使用的是 OP 中声明的属性,但没有将其引用为self.mystruct,这会产生编译器错误(因为这会调用合成的 getter 方法)。

于 2015-06-10T09:09:07.870 回答
2

这个问题本身表明至少对术语缺乏理解。

属性是由对象公开的两个(或一个只读)方法组成的接口,即 getter 和 setter 方法,在这种情况下:

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

谈论“获取财产地址”是没有意义的。

您可以获取实例变量 (ivar) 的地址。在这种情况下,您有一个名为 mystruct 的 ivar,您可以&mystruct在 MyClass 的方法中获取它的地址。由于它被标记@protected(默认情况下),您可以在子类中使用&self->mystruct. 如果你标记它@public,那么你可以使用它来获取它的地址&myobj->mystruct。这是一个糟糕的想法,你真的应该重新考虑这一点,但你可以做到。

如果您只是想将 ivar 的地址用于某些短期目的(例如,如果 MyStruct 很大),您可以这样做,但这会非常不寻常,您最好编写一个显式命名的方法,例如:

- (MyStruct*) getAddressForSettingMyStruct;

如果它只是只读的,最好使用 const MyStruct*。

于 2009-07-09T12:56:05.823 回答
2

MyStruct mystruct是私有的MyClass,我假设当你这样做时,myClass.myStruct你只是指生成的访问器方法而不是实际的结构。

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

于 2009-07-09T06:12:06.877 回答
2

要获取指向 myStruct 实例变量的指针,您需要编写一个返回指向该实例变量的指针的方法。

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

不过,我真的不认为这是一个好主意。其他对象不应该从它下面改变该对象的 ivar,这是您可以使用指向该结构的指针做的唯一事情,而您无法使用由值返回的结构的副本来做。

于 2009-07-09T06:24:43.077 回答