[英]Why Do I Have to Create An Object and Assign It to A Property in Objective C?
所以我有了這段代碼,但它不起作用:
for (NSDictionary *item in data){
[self.resultsArray addObject:item];
}
self.resultsArray為零。 但后來我將其更改為:
NSMutableArray *myDataArray = [[NSMutableArray alloc] init];
for (NSDictionary *item in data){
[myDataArray addObject:item];
}
self.resultsArray = myDataArray;
[myDataArray release];
現在它起作用了。 現在填充self.resultsArray
所以我是Objective C的初學者,我想知道為什么我不能只在屬性的addObject中直接使用它。 為什么我必須創建另一個可變數組,將其填充,將其分配給resultsArray屬性,然后釋放我制作的可變數組?
提前致謝!
編輯 :另外,在我一直在研究的許多書籍中,這已經完成了很多。
簡單的答案
您沒有在添加對象之前初始化self.resultArray
。 這僅僅是一個指針,它是零,直到你的價值alloc
它。
self.resultArray = [[NSMutableArray alloc] init];
在向其添加對象之前,將解決該問題。
但是,這種分配方式將導致內存泄漏,因此在書籍和示例中均未顯示。 如果可能發生內存泄漏self.resultArray
屬性標記為retain
,並通過調用它的alloc將保留的2倍。
如果self.resultsArray
是零,那么[self.resultsArray addObject:item]
將不是一個對象添加到數組,它只會什么也不做(因為數組將是nil
默認情況下,和將消息發送到nil
是一個空操作在Objective-C中)。 當將可變數組創建為局部變量時,可以向其中添加內容-然后,如果將其分配給該屬性,那么一切都會按預期進行,並且self.resultsArray
將不再為零。
通常,當您具有這樣的屬性時,可以在init方法中進行設置:
- (id)init {
// ...
self.resultsArray = [NSMutableArray array];
// or access the ivar directly:
// _resultsArray = [[NSMutableArray alloc] init];
// ...
}
然后,一旦您的對象被初始化,您就可以將東西添加到數組中。 同樣,如果您不這樣做,默認情況下它將nil
,並且[self.resultsArray addObject:item]
將無效。
您可能沒有初始化數組(我將假設myDataArray是NSMutableArray)。
在您的init方法中,調用myDataArray = [NSMutableArray array];
它會工作
需要注意的重要一點是,由於沒有數組開頭,因此您不會創建另一個可變數組。 僅聲明屬性或變量不會創建對象。 這就是self.resultsArray以nil開始的原因。
您擁有的工作代碼旨在允許您在保留數組兩次時顯式釋放該數組:一次是在分配數組時,一次是在將數組分配給屬性時。 您只想要其中一個保留,因此您釋放一次。
您可以這樣做:
self.resultsArray = [[NSMutableArray alloc] init];
[self.resultsArray release];
for (NSDictionary *item in data){
[self.resultsArray addObject:item];
}
這是更少的代碼,但不清楚。 清晰度很重要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.