【问题标题】:Accessing Instance Variable in C Style Method以 C 风格方法访问实例变量
【发布时间】:2018-04-14 00:20:44
【问题描述】:

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

这是我正在解释的一个例子:

   @interface FontManager : NSObject {      
                CGFontRef fontRef;
   }

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

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

任何见解将不胜感激。

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    “C 风格的方法”并不真正值得称为“方法”,我将其称为“函数”,而不是像 C 中那样。

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

    【讨论】:

    • 感谢您的第一反应。我认为这是一个很好的答案,但下面@skue 的帖子提供了两个解决问题的选项。也感谢您对我的语义的更正。
    【解决方案2】:

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

    但是,如果 FontManager 是单例并且您将 fontRef 设为属性(或为其创建访问器),则可以访问 C 类中的值:

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

    底线,您可以在 C 函数和 ObjC 方法中混合匹配 C 和 ObjC 语法。但是因为 C 函数没有对 self(以及对象关联的实例变量)的默认引用,所以您只能引用作为单例、存储在全局变量中或作为参数传入的 ObjC 对象。

    【讨论】:

    • 感谢您的回复。我对这个主题做了更多的研究,并且正在理解这个概念。从那以后,我已经实现了使用静态 C 变量来保存对我的类实例的引用。我用它来调用我的实例属性方法,以便从 C 函数中访问实例变量(而不是其他人明智地纠正我的方法)。
    【解决方案3】:

    没错。不过,您似乎在混淆方法和功能。方法只存在于 Objective-C 中。您所说的“C 风格方法”实际上只是一个 C 函数。

    C 不是面向对象的编程语言。由于 C 中没有对象之类的东西,因此 C 中也没有实例变量之类的东西,因此 fontRef 实例变量在您发布的函数中不可见,在任何其他 C 函数中也不可见你的程序。

    【讨论】:

    • 好点。我在其他帖子中看到过这个论点,即 C 函数不应该被称为方法,这是一个有效的论点。在尝试理解概念时,语义很重要。感谢您的反馈。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 2023-03-21
    • 2011-09-15
    • 2017-03-20
    • 2021-06-03
    • 2012-08-23
    相关资源
    最近更新 更多