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