我在一个类中有一个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
,它给我零。
答案 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 */ );
}