2010-10-25 83 views
1

我需要爲自定義結構類型的C數組聲明一個屬性。使用C數組作爲屬性

有人可以解釋我應該怎麼做這個C數組至於屬性聲明?我應該不使用財產聲明嗎?

我試着memset()在陣列中的內存,並失敗與編譯錯誤悲慘。有人可以解釋一下嗎?

回答

2

這個答案並不能真正解決你的問題,它只是解釋了爲什麼你的方法不起作用。

在C中,你不能從函數返回數組類型。這只是語言的限制(有意或無意我不知道)。通過擴展,在Objective-C中,您不能從方法返回數組類型。這也意味着你不能使用數組類型作爲屬性,因爲編譯器無法返回一個數組類型的方法。

當在表達式中使用時,C數組會自動轉換爲指針類型,所以您可以遵循@ Graham的建議並使用指針。這種方法的缺點是,您必須確切知道陣列中有多少個元素,以便您不會意外地讀過它的末尾。如果元素的數量在編譯時是固定的和已知的,那麼這可能是要走的路(如果你想避免NSArray出於任何原因)。

這是很難回答爲什麼memset失敗,沒有真正看到你如何使用它,但一般來說這種編譯是如何使用:

MyStruct someStructs[10]; 

memset(someStructs, 0, sizeof someStructs); 

另外,也可以從函數返回結構/方法,即使它們包含數組。從理論上講,你可以創建一個包含數組MyStruct的結構,並使用這個新的結構類型作爲屬性類型。實際上,這不是一個好主意,因爲它只是增加了一層複雜性。

+0

您也可以讀取/寫入數組語法數組的末尾。以下是合法的,雖然破壞了,C: int x [2] = {0}; x [27] = 3; – 2010-10-25 09:49:41

0

你當然可以將數組視爲一個屬性,它將有「分配」行爲,因爲你不能保留一個結構。基本上,你仍然完全負責數組的內存分配。

你有的另一個選擇是用一個對象替換你的結構。然後,它更自然地與物業機器合作,併爲您打開像NSArray這樣的基礎集合課程。

+0

我對使用NSArray(這是我最初的方法)有點不確定。我只是想像C中一樣簡單地直接訪問數組元素,但不確定是否可以簡單地分配一個NSArray和訪問元素16,例如,寫入和讀出它,或者如果有一些不同行爲與它們相比,C陣列不允許這樣做。回想起來,儘管如此,我想我應該已經認識到它的行爲就像C數組一樣,可以訪問隨機元素並設置/獲取它們的值,而無需填充較低的索引元素。 – Joey 2010-10-25 07:25:01

+0

另外,我有一些問題試圖將其設置爲屬性。如果我有MyStruct mList [5];作爲我的成員var,我不能做@property(nonatomic,assign)MyStruct mList [5];因爲我得到一個不良的屬性聲明編譯錯誤。 – Joey 2010-10-25 07:29:36

+0

@Joey:我認爲你需要將屬性定義爲'@property(nonatomic,assign)MyStruct * mList;'將它用作C數組。對於'NSArray',你必須先填入元素0-7,然後才能使用元素8.你可以使用對象'[NSNull null]'作爲未設置值的佔位符。 – 2010-10-25 07:41:00

1

如果你有這樣的:

@interface MyClass 
{ 
    struct MyStruct foo[5]; 
} 
@end 

你不能有一個讀/都寫屬性。你可以聲明一個只讀屬性

@property (readonly, assign) struct MyStruct* fooProperty; 

它會給你一個指向數組的指針。但是,這可能是不好的,因爲它會讓您的代碼的其餘部分內部訪問MyClass的結構。實施KVC indexed accessors會更好,您必須手動完成。