【问题标题】:class variable scope issue with objc / cocoa?objc / 可可的类变量范围问题?
【发布时间】:2011-04-20 00:37:09
【问题描述】:

在 Leopard 10.5.8 下使用 GCC 4 在 XCode 3.1.3 中编译,我的目标是 10.5...

我有一个接口,因此:

@interface testThing : NSObject { classContaininghooHa *ttv; }
@end

还有一个实现,因此:

@implementation: testThing

- (void) instanceMethodMine
{
    [ttv hooHa]; // works perfectly, compiles, links, hooHa is invoked.
}

//    void cFunctionMine()
//    {
//        [ttv hooHa]; // compiler: 'ttv' undeclared (first use in this function) "
//    }

void stupidCFunctionMine((testThing *)whom) // whom is passed class 'self' when invoked
{
   [whom instanceMethodMine]; // compiles, links, works. :/
}

@end

现在,我的理解——显然是有缺陷的——是如果你声明了一个变量、类 ID 或其他,它是类私有的,但在类中,本质上是作为全局执行的,存储在分配的类中实例在其存在期间。

这就是它对 objc 方法的作用。

但是在上面的 c 函数中,也写在类中,变量似乎是不可见的。对我来说没有意义,但确实如此。

谁能给我解释一下这是怎么回事?

当您使用它时,如何将其声明为实例变量,以便我可以在如上所示的类范围内声明的 c 函数内以及在方法内使用该方法?

非常感谢您的洞察力。

【问题讨论】:

    标签: objective-c cocoa macos


    【解决方案1】:

    在您声明/定义“正常”c 函数的位置没有任何区别。它们不是类的一部分,它们只是普通的旧 c 函数。与班级没有任何联系。如果您真的不想让这个函数成为真正的 Objective-c 方法,那么传递他们处理的实例是一种解决方法。

    【讨论】:

    • 现实生活中的函数是来自数据库引擎的 c 回调,所以它不能是 objc 方法,至少据我所知(可能是错的,希望我是。)有趣的是 c 的东西不属于课程的一部分。
    【解决方案2】:

    interface 方法可以完全访问它的成员变量。而C 函数不是类的一部分,因此它不能访问任何类变量,除非它以类实例作为参数。

    void cFunctionMine()
    {
        [ttv hooHa]; // compiler: 'ttv' undeclared (first use in this function) 
    }
    

    显然cFunctionMine 不是界面的一部分。所以ttv发送消息hooHa并不是什么。

    当您使用它时,如何将其声明为实例变量,以便我可以在如上所示的类范围内声明的 c 函数内以及在方法内使用该方法?

    void cFunctionMine()
    {
        // 1. Create an instance using alloc and init
    
        testThing *ttv = [ [testThing alloc] init ] ;
        [ttv hooHa] ; 
    
        // Now the above statement is valid. We have a valid instance to which 
        // message can be passed to.
    
        // .....
    
        [ ttv release ] ;
        // release the resources once you are done to prevent memory leaks.
    }
    

    【讨论】:

    • 不... ttv 实例已经存在。不想制作更多它们,这既浪费稀缺资源又是不必要的(特别是因为 ttv 是一个大类,实例方法可能(是!)有问题。)我上面的方法要好得多 - 很少所涉及的代码或时间,它的工作原理。
    猜你喜欢
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    相关资源
    最近更新 更多