在C风格方法中访问实例变量

时间:2011-03-11 03:14:31

标签: objective-c

有人可以确认您无法从同一类的C样式函数中访问Objective C @implementation块中定义的实例变量吗?编译器抛出错误,说“XXX未声明',其中XXX是实例变量名。

以下是我要解释的一个例子:

   @interface FontManager : NSObject {      
                CGFontRef fontRef;
   }

   static int CstyleFunction() {
        NSUInteger emSize = CGFontGetUnitsPerEm(fontRef);
   }

我想验证我不能使用“CstyleFunction”中的“fontRef”。

非常感谢任何见解。

3 个答案:

答案 0 :(得分:3)

“C风格方法”实际上并不值得使用名称“方法”,我将其称为“函数”而不是C语言。

C函数没有self,所以它不能像方法那样隐式访问ivars。如果将实例作为参数传递给C函数,则可以像访问结构指针中的字段一样访问ivars。

答案 1 :(得分:1)

这是对的。你似乎在混淆方法和功能。方法仅存在于Objective-C中。你所说的“C风格方法”实际上只是一个C函数。

C不是面向对象的编程语言。由于C中没有对象这样的东西,所以C中也没有实例变量这样的东西,所以fontRef实例变量在你发布的函数中不可见,也不会在任何其他C中看到在你的程序中运行。

答案 2 :(得分:1)

@Anomie和@jlehr是正确的,C函数没有FontManager对象及其当前状态的概念,它恰好存在于同一个文件中。

但是,如果FontManager是一个单例并且你使fontRef成为一个属性(或为它创建一个访问器),那么就可以访问C类中的值:

static int CstyleMethod() {
    FontManager *fm = [FontManager sharedManager];
    NSUInteger emSize = CGFontGetUnitsPerEm(fm.fontRef);
}

最重要的是,您可以在C函数和&amp ;;中混合匹配C和ObjC语法。 ObjC方法。但由于C函数没有对self的默认引用(以及对象的关联实例变量),因此您只能引用单个对象,存储在全局变量中或作为参数传入的ObjC对象。