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

Objective c objc/cocoa的类变量范围问题?,objective-c,cocoa,macos,Objective C,Cocoa,Macos,在XCode 3.1.3中编译,使用GCC4,在Leopard 10.5.8下,以10.5作为我的目标 我有一个接口,因此: @interface testThing : NSObject { classContaininghooHa *ttv; } @end 以及一项实施,因此: @implementation: testThing - (void) instanceMethodMine { [ttv hooHa]; // works perfectly, compiles, li

在XCode 3.1.3中编译,使用GCC4,在Leopard 10.5.8下,以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函数中以及在方法中使用该方法


非常感谢您的洞察力。

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

void cFunctionMine()
{
    [ttv hooHa]; // compiler: 'ttv' undeclared (first use in this function) 
}
显然,
cFunctionMine
不是接口的一部分。因此,发送消息并不像
ttv
所说的那样
hooHa

当您这样做时,如何将其声明为一个实例变量,以便在如上所示的类范围内声明的c函数中以及在方法中使用该方法


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

现实生活中的函数是一个从数据库引擎返回的c调用,所以它不可能是一个objc方法,至少据我所知(可能是错误的,希望是)。这很有趣,c的东西不是类的一部分。不。。。ttv实例已存在。我不想做得更多,这既浪费了稀缺的资源,也不必要(特别是因为ttv是一个大类,实例方法可能(是!)有争议。)我上面的方法要好得多——只需要很少的代码或时间,而且有效。
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.
}