我需要爲自定義結構類型的C數組聲明一個屬性。使用C數組作爲屬性
有人可以解釋我應該怎麼做這個C數組至於屬性聲明?我應該不使用財產聲明嗎?
我試着memset()
在陣列中的內存,並失敗與編譯錯誤悲慘。有人可以解釋一下嗎?
我需要爲自定義結構類型的C數組聲明一個屬性。使用C數組作爲屬性
有人可以解釋我應該怎麼做這個C數組至於屬性聲明?我應該不使用財產聲明嗎?
我試着memset()
在陣列中的內存,並失敗與編譯錯誤悲慘。有人可以解釋一下嗎?
這個答案並不能真正解決你的問題,它只是解釋了爲什麼你的方法不起作用。
在C中,你不能從函數返回數組類型。這只是語言的限制(有意或無意我不知道)。通過擴展,在Objective-C中,您不能從方法返回數組類型。這也意味着你不能使用數組類型作爲屬性,因爲編譯器無法返回一個數組類型的方法。
當在表達式中使用時,C數組會自動轉換爲指針類型,所以您可以遵循@ Graham的建議並使用指針。這種方法的缺點是,您必須確切知道陣列中有多少個元素,以便您不會意外地讀過它的末尾。如果元素的數量在編譯時是固定的和已知的,那麼這可能是要走的路(如果你想避免NSArray
出於任何原因)。
這是很難回答爲什麼memset
失敗,沒有真正看到你如何使用它,但一般來說這種編譯是如何使用:
MyStruct someStructs[10];
memset(someStructs, 0, sizeof someStructs);
另外,也可以從函數返回結構/方法,即使它們包含數組。從理論上講,你可以創建一個包含數組MyStruct
的結構,並使用這個新的結構類型作爲屬性類型。實際上,這不是一個好主意,因爲它只是增加了一層複雜性。
你當然可以將數組視爲一個屬性,它將有「分配」行爲,因爲你不能保留一個結構。基本上,你仍然完全負責數組的內存分配。
你有的另一個選擇是用一個對象替換你的結構。然後,它更自然地與物業機器合作,併爲您打開像NSArray這樣的基礎集合課程。
我對使用NSArray(這是我最初的方法)有點不確定。我只是想像C中一樣簡單地直接訪問數組元素,但不確定是否可以簡單地分配一個NSArray和訪問元素16,例如,寫入和讀出它,或者如果有一些不同行爲與它們相比,C陣列不允許這樣做。回想起來,儘管如此,我想我應該已經認識到它的行爲就像C數組一樣,可以訪問隨機元素並設置/獲取它們的值,而無需填充較低的索引元素。 – Joey 2010-10-25 07:25:01
另外,我有一些問題試圖將其設置爲屬性。如果我有MyStruct mList [5];作爲我的成員var,我不能做@property(nonatomic,assign)MyStruct mList [5];因爲我得到一個不良的屬性聲明編譯錯誤。 – Joey 2010-10-25 07:29:36
@Joey:我認爲你需要將屬性定義爲'@property(nonatomic,assign)MyStruct * mList;'將它用作C數組。對於'NSArray',你必須先填入元素0-7,然後才能使用元素8.你可以使用對象'[NSNull null]'作爲未設置值的佔位符。 – 2010-10-25 07:41:00
如果你有這樣的:
@interface MyClass
{
struct MyStruct foo[5];
}
@end
你不能有一個讀/都寫屬性。你可以聲明一個只讀屬性
@property (readonly, assign) struct MyStruct* fooProperty;
它會給你一個指向數組的指針。但是,這可能是不好的,因爲它會讓您的代碼的其餘部分內部訪問MyClass的結構。實施KVC indexed accessors會更好,您必須手動完成。
您也可以讀取/寫入數組語法數組的末尾。以下是合法的,雖然破壞了,C: int x [2] = {0}; x [27] = 3; – 2010-10-25 09:49:41