Objective c objc/cocoa的类变量范围问题?
在XCode 3.1.3中编译,使用GCC4,在Leopard 10.5.8下,以10.5作为我的目标 我有一个接口,因此: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
@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.
}