objc / cocoa的类变量范围问题?

时间:2011-04-20 00:37:10

标签: objective-c cocoa macos

在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函数中使用该方法,如上所示,以及在方法中?

非常感谢。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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

显然cFunctionMine不是界面的一部分。因此ttv发送消息hooHa并不是什么。{/ p>

  

当你在它的时候,如何将它声明为一个实例变量,这样我就可以在类范围内声明的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.
}