在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函数中使用该方法,如上所示,以及在方法中?
非常感谢。
答案 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.
}