2011-05-06 53 views
7

我很難搞清楚什麼時候分配對象。我正在閱讀Apress iPhone Dev for Beginners的書。有時候它說使用:在目標C中,何時使用alloc,何時不使用

UIImage *seven = [UIImage imageNamed:@"seven.png"]; 

等次,

UIImageView *sevenView = [[UIImageView alloc] initWithImage:seven]; 

你爲什麼不第一例ALLOC的UIImage?

謝謝 - 絕對初學者。

回答

2

約定是,只要你調用[Foo alloc],你必須在釋放後產生Foo對象。另一方面,如果該方法被稱爲[fooWithBar]或類似的東西,它會返回一個自動釋放對象,噹噹前系統調用的函數返回時,該對象將被自動釋放。

0

這可能會引起混淆。在上面的例子中,[UIImage imageNamed]方法是一種靜態方便的方法,API的創建者決定將會有所幫助。在該方法將返回給你一個自動釋放類型的對象UIImage

當你使用Cocoa Touch API的時候,會讓變得更熟悉它們,使用函數等等的方便性會更自然。

注:在你上述的兩種情況,一是會給你一個自動釋放的UIImage和第二會給你,你當你想放棄對象的所有權,專門發佈一個UIImageView(或你會得到一個內存泄漏)。

有關UIImage和UIImageView的一些信息,請看thread

9

initWithImage:是一個實例方法 - 消息必須發送到一個特定的對象。您使用alloc創建了這樣一個對象實例。

imageNamed:是一種類方法。它不需要被髮送到類的一個實例,所以你不分配一個對象。這種返回對象的方法通常會分配和初始化一個對象。

您可以在類參考中找到哪些方法是類方法和哪些方法是實例方法的信息。另外,類方法聲明以+開頭,如+ (UIImage *)imageNamed:(NSString *)name-的實例方法,如- (id)initWithData:(NSData *)data

順便說一句,alloc只是一個NSObject的分類方法。

0

一個很好的經驗法則是,當你知道你的對象將持續很久,或者當你創建一個永遠不需要離開的對象時,你想要使用-alloc創建它的方法的範圍 - 在這兩種情況下,您都可以避免自動釋放對象帶來的(儘管很小)開銷,並且知道您將內存佔用最小化 - 默認情況下,自動釋放對象實際上不會直到下一次運行循環,這在未來可能會相當長。這就是說,使用便利的方法通常可以更容易地產生一定條件下的對象,一般而言,自動釋放對象對於將對象返回堆棧非常有用。