2012-04-12 85 views
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' 
在這兩種情況下

,使用指針將SOLV這個問題,但他們之間有什麼區別?

與試錯的方法,我發現,如果我改變@class CCNode#import "CCNode.h"然後它給了我同樣的錯誤作爲第一行,但我definetly失去了一些東西對於正確理解....

+0

可能重複的[接口類型不能靜態分配?](http://stackoverflow.com/questions/8460340/interface-type-cannot-be-statically-allocated) – 2012-04-12 18:30:07

回答

2

@class是你的類的前向聲明。它具有不完整的類型,因爲編譯器不知道它有多大,它是一個結構,一個對象,一個內建類型等等。當你導入這個頭文件時,編譯器擁有它所需要的所有信息。

+0

好吧,這很清楚..謝謝!所以,保持前向定義(不導入CCNode的頭部)並將屬性聲明爲指針(這會消除錯誤),這是一個好習慣嗎?還是應該改變它? – Khalizar 2012-04-12 12:49:28

+0

這是一個很好的做法。使用類的前向聲明使得如果你改變CCNode的頭部,它不會考慮myClass的頭部也改變了。這限制了需要重新編譯的文件的數量。 – wbyoung 2012-04-12 13:02:16

3

指針需要用*聲明,所以你的聲明應該是這樣的:

@class CCNode; 

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

我知道...我是隻是想知道爲什麼它給了我不同的錯誤:) – Khalizar 2012-04-12 12:42:20

4

他們之間有什麼區別?

編譯器知道的NSMutableArray完整定義,因爲它的頭文件是通過Foundation.h頭包括在內。它所知道的關於CCNode的是它是一個Objective-C類(感謝@class),而不是它有多大或什麼。

這就是爲什麼包括CCNode.h具有更改錯誤的效果,因爲編譯器現在知道它有多大。

0

在Objective-C中,你不能在堆棧上分配一個對象,所以這個點是沒有意義的。 Objective-C要求所有對象都是動態分配的(即在堆上)。您收到的錯誤表明您正在嘗試在堆棧上創建CCNode對象。所有Objective Class對象都是指針類型。

靜態分配變量用於原始的C類型如int或雙

INT馬克= 100;