从C函数访问类ivar

时间:2013-11-21 13:02:06

标签: objective-c c

我在一个类中有一个C函数(是的,必须在C中),我需要从该类访问一个ivar。有问题的ivar是NSMutableDictionary。

据我所知,C函数无法直接访问类的ivars,必须将引用传递给它们。所以,我在实现之前添加了这个

static NSMutableDictionary *myIvarRef;

并在该类的init上执行此操作。

- (id)init
{
    self = [super init];
    if (self != nil)
    {
        myIvar = [[NSMutableDictionary alloc] init];
        myIvarRef = myIvar;
    }
    return self;
}

之后,在该函数中,当我尝试使用myIvarRef时,它是nil。

我错过了什么?

感谢


C函数很复杂,但我尝试使用的行就像这样

MyObject obj = myIvarRef[myKey];

我在这一行放了一个断点,当它停止时我在控制台上键入po myIvarRef,它给我零。

1 个答案:

答案 0 :(得分:2)

您的代码存在一个很大的问题,即静态myIvarRef变量被覆盖 每次init调用,因此始终指向上次创建的对象的ivar。

更好的解决方案是将对象指针作为附加参数传递给 C功能。像这样:

void myFunction(void *uData, /* other parameters */ )
{
    MyClass *obj = (__bridge MyClass *)(uData);
    // Now you can access all properties, ivars etc of obj.   
    // ...
}

- (void)myMethod
{
    // Call C function from Objective-C method:
    myFunction((__bridge void *)(self), /* other arguments */ );
}