有人可以确认您无法从同一类的C样式函数中访问Objective C @implementation块中定义的实例变量吗?编译器抛出错误,说“XXX未声明',其中XXX是实例变量名。
以下是我要解释的一个例子:
@interface FontManager : NSObject {
CGFontRef fontRef;
}
static int CstyleFunction() {
NSUInteger emSize = CGFontGetUnitsPerEm(fontRef);
}
我想验证我不能使用“CstyleFunction”中的“fontRef”。
非常感谢任何见解。
答案 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对象。