了解指针的正确用法

时间:2012-04-12 12:34:43

标签: objective-c pointers cocos2d-iphone

我在界面中声明了两个属性 它们都应该是指针,但xcode给了我两个不同的错误..

// myClass.h

#import <Foundation/Foundation.h>

@class CCNode;

@interface myClass : NSObject
{
    NSMutableArray myArray;
    CCNode myNode;
}

表示NSMutableArray:

Interface type cannot be statically allocated

用于CCNode:

Field has incomplete type 'CCNode'

在这两种情况下,使用指针都可以解决问题,但它们之间的区别是什么?

通过尝试错误的方法,我发现如果我将@class CCNode更改为#import "CCNode.h",那么它会给我与第一行相同的错误,但我肯定会错过一些东西正确的理解......

4 个答案:

答案 0 :(得分:4)

  

它们之间有什么区别?

编译器知道NSMutableArray的完整定义,因为它的头文件是通过Foundation.h标头包含的。所有它知道的CCNode是它是一个Objective-C类(感谢@class),而不是它有多大或者其他任何东西。

这就是为什么包含CCNode.h会改变错误的原因,因为编译器现在知道它有多大。

答案 1 :(得分:3)

指针需要使用*声明,因此您的声明应如下所示:

@class CCNode;

@interface myClass : NSObject
{
    NSMutableArray *myArray;
    CCNode *myNode;
}

答案 2 :(得分:2)

@class是你班级的前瞻声明。它的类型不完整,因为编译器不知道它有多大,无论是结构,对象,内置类型等。导入标题时,编译器都具有所需的所有信息。

答案 3 :(得分:0)

在Objective-C中,你不能在堆栈上分配一个对象,所以这一点没有实际意义。 Objective-C要求动态分配所有对象(即在堆上)。您获得的错误表明您正在尝试在堆栈上创建CCNode对象。所有Objective Class对象都是指针类型。

静态分配的变量用于原始C类型,如int或double

int marks = 100;