1

我在我的界面中声明了两个属性,它们都应该是指针,但是 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"then 它会给我与第一行相同的错误,但我肯定会错过一些正确理解的东西....

4

4 回答 4

4

他们之间有什么区别?

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

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

于 2012-04-12T12:53:34.540 回答
3

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

@class CCNode;

@interface myClass : NSObject
{
    NSMutableArray *myArray;
    CCNode *myNode;
}
于 2012-04-12T12:40:07.397 回答
2

@class 是您的班级的前向声明。它具有不完整的类型,因为编译器不知道它有多大,是结构、对象还是内置类型等。当您导入标头时,编译器拥有它需要的所有信息。

于 2012-04-12T12:41:06.727 回答
0

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

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

整数标记=100;

于 2012-04-12T13:38:08.623 回答