簡體   English   中英

為什么必須在Objective C中創建對象並將其分配給屬性?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM