2010-05-22 33 views
0

我有以下的新手問題:這種發佈爲什麼不起作用?

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    NSArray *anArray; 
    anArray = [dictionary objectForKey: [NSString stringWithFormat:@"%d", section]]; 
    //here dictionary is of type NSDictionary, initialized in another place. 
    AnObject *obj = [[AnObject alloc] init]; 
    obj = [anArray objectAtIndex:0]; 
    [anArray release]; 
    return obj.title; 
} 

如果我運行它,因爲它是我會得到一個錯誤。 如果我不把[anArray發佈]它工作得很好。 我不太明白爲什麼會發生這種情況?

謝謝。

+0

什麼JeremyP說。然而,你也不必要地分配了一個'AnObject'的實例,然後將它泄漏到下一行。 – bbum 2010-05-22 18:17:23

回答

2

你絕對必須閱讀並理解Cocoa Memory Management Rules,特別是其中規定的基本規則:

你把一個對象的所有權如果您使用名稱以「alloc」或「new」開頭或包含「copy」(例如alloc,newObject或mutableCopy)的方法創建它,或者如果您將其發送給零售商n消息。您有責任放棄使用發行版或自動發行版所擁有的對象的所有權。任何其他時間你收到一個對象,你必須而不是釋放它。

現在,看看你是如何得到一個陣列。您使用了方法objectForKey:它不以alloc開始,也不是新的,也不包含副本。你也沒有保留一個陣列。因此,你不擁有一個數組。你不能釋放它。

上面引用的規則是關於在iPhone或Mac上使用Cocoa編程而不進行垃圾回收的最重要的知識。其中一張海報上出現了縮寫NARC(New Alloc Retain Copy)作爲備忘錄,非常方便。

讓我們將規則應用於代碼中名爲obj的變量。你通過調用alloc來獲得,因此你有責任釋放它。但是,您通過調用objectForIndex再次獲得它(覆蓋以前的值):因此,在此之後,您不得釋放它。然而,第一個值需要釋放,現在已經泄漏。實際上,分配線是不必要的。

+0

Thnak你,我現在明白了。 – CristiC 2010-05-22 15:03:37

+0

我的答案略有不準確。引用的規則是關於在非* GC環境中編程Cocoa(iPhone不是GC)的最重要知識。 – JeremyP 2010-05-22 15:29:39

1

您不需要釋放anArray,因爲您沒有創建它。字典只是給你一個指向它的指針。

你看起來有創建AnObject的內存泄漏。在下一行中,您將變量「obj」重新賦值爲從aArray獲得的值。但是你還沒有發佈你在上面的行中創建的AnObject。

我覺得你的代碼應該是這樣的:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    NSArray *anArray; 
    anArray = [dictionary objectForKey: [NSString stringWithFormat:@"%d", section]]; 
    //here dictionary is of type NSDictionary, initialized in another place. 
    obj = [anArray objectAtIndex:0]; 
    return obj.title; 
} 

你並不需要釋放您尚未創建什麼。

+0

看來我們同時發佈了幾乎完全相同的答案;) – Jasarien 2010-05-22 14:15:55

1

anArray不會被您分配,保留,複製或刷新,所以您不需要發佈它。

另外,你有一個漏洞,你使用alloc/init創建了一個全新的AnObject實例,但是直接從數組中得到一個新的值。

您的代碼應該是這樣的:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    NSArray *anArray; 
    anArray = [dictionary objectForKey: [NSString stringWithFormat:@"%d", section]]; 
    //here dictionary is of type NSDictionary, initialized in another place. 
    AnObject *obj = [anArray objectAtIndex:0]; 
    return obj.title; 
} 
+0

他他,你說它*不是*種族:-) – drekka 2010-05-22 14:28:10

相關問題