C函数访问Objective-C类的私有ivar

时间:2016-01-01 12:04:39

标签: objective-c

根据this comment

  

@implementation块中的C函数具有唯一的属性   能够直接访问私人和受保护的ivars。因此,来自   我自己的经验,它成为放置C函数的强大习惯   “属于”相应实现中的类。

我的代码,仅在this answer建议的实现中定义私有实例变量:

括号:

@implementation ViewController{
MyTest *tt;
}

void testf(){
    NSLog(@"hello back from c++ into obj c land");
    [tt testcf: 5];
}

...

不会建造;编译器指示tt中的testf未声明。如果我删除括号,那么C函数可以正常工作。

但是......如果我删除括号,我是否理解实际上这不再是一个实例变量,但是偷偷摸摸它是一个全局变量,与类断开连接,无法在@implementation中放置它?这似乎确实如此,因为我可以做到这一点:

@end

void testf2(){
    NSLog(@"hello back from c++ into obj c land");
    [tt testcf: 5];
}

编译器不包含约tt超出范围的内容。那么 - 如何在一个实现中声明一个私有实例变量并让它真正成为一个实例变量,还有一个C函数能够访问它吗?出于这个问题的目的,我试图在不使用对象本身的id指针的情况下,根据链接的注释/答案使其工作。

1 个答案:

答案 0 :(得分:2)

您需要将对self的引用传递给C函数:

void testf(ViewController *vc){
    NSLog(@"hello back from c++ into obj c land");
    [vc->tt testcf: 5];
}

并将其称为:

- (void)someMethodInViewController
{
    testf(self);
}

然而,目前尚不清楚为什么要使用C函数。