2010-03-22 45 views
2

在以下一段代碼中(來自一本書)數據是一個NSDictionary * data;在頭文件中定義(無屬性)。應該變量被釋放還是不變? iphone-sdk

viewDidLoad中控制器會出現以下情況的:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSArray *keys = [NSArray arrayWithObjects:@"home", @"work", nil]; 
    NSArray *homeDVDs = [NSArray arrayWithObjects:@"Thomas the Builder", nil]; 
    NSArray *workDVDs = [NSArray arrayWithObjects:@"Intro to Blender", nil]; 
    NSArray *values = [NSArray arrayWithObjects:homeDVDs, workDVDs, nil]; 
    data = [[NSDictionary alloc] initWithObjects:values forKeys:keys]; 

} 

因爲我是真正的新的Objective-C,爲什麼我沒有保留變量鍵可有人向我解釋,homeDVDs ,workDVDs和值之前退出該功能?我希望之前的數據分配如下:

[keys retain]; 
[homeDVDs retain]; 
[workDVDs retain]; 
[values retain]; 

或不? InitWithObjects將所有對象複製(遞歸)到一個新表中?

假設我們沒有最後一行(數據分配),我們應該釋放所有NSArrays退出函數之前(或者我們可以安全地假定所有NSArrays將被自動釋放,因爲對於每一個沒有ALLOC?)

謝謝!

回答

5

在Core Foundation中,大多數對諸如arrayWithObjects等方法的靜態調用都會返回自動釋放的實例,這意味着您不需要(甚至不必!)自行釋放它。

因此,執行代碼之後的情況是,使用arrayWithObjects:calls創建的所有數組都是自動釋放的,但在添加到其他數組或字典時會保留。因此,將homeDVD和workDVD添加到values數組時保留,並且在添加到數據字典時鍵和值數組都保留。所以你不需要明確地釋放你的數組,但是你需要在某個時候釋放你的數據字典(也許在dealloc方法實現中)。

0

NSDictionary副本關鍵字段和保留的值。所有其他實例都是自動發佈的,因此您不會錯過任何發佈或保留(假設您在dealloc方法中發佈了data)。

相關問題