2011-07-15 43 views
1

如何在使用alloc和init創建對象時設置保留屬性? (不使用自動釋放創建對象並設置保留屬性

這一行的標題(和實施相應的@synthesize線):

@property(retain)UIWebView *webView; 

這是三個選項我有(我認爲):


UIWebView *tempWebView = [[UIWebView alloc] init]; 
[tempWebView setDelegate:self]; 
tempWebView.hidden = YES; 
self.webView = tempWebView; 
[tempWebView release]; 

(這一個似乎是最好的關於內存管理,但它更多的代碼,涉及一個愚蠢的變量名,所以減少在可讀性)


self.webView = [[UIWebView alloc] init]; 
[self.webView release]; 
[self.webView setDelegate:self]; 
self.webView.hidden = YES; 

(這一次是發生了什麼,但內存管理似乎並不很大,也Xcode的分析器不喜歡它)


webView = [[UIWebView alloc] init]; 
[self.webView setDelegate:self]; 
self.webView.hidden = YES; 
更明顯

(這個是最短的,比第一個例子更明顯。但是,它繞過了二傳手,所以應設置器的自定義實現稍後才能實現它不會在這種情況下工作)


所以應使用的例子,或者是有沒有更好的辦法?

回答

1

最好的選擇,國際海事組織,是使用自動釋放一個你不喜歡的,即:

self.webView = [[[UIWebView alloc] init] autorelease]; 

如果你不想,想一個班輪初始化,唯一的選擇是你的第三個一個:

webView = [[UIWebView alloc] init]; 

因爲所有其他人都需要顯式行來執行額外的發佈。

我不認爲它是壞的,尤其是當它屬於init方法,並且你不在別處重新分配它而不使用該屬性時,我自己在我看來合理時使用它。

什麼作品真的很好用保留的屬性是便利構造函數,如:

self.image = [UIImage imageWithContentsOfFile:xxxxxxx]; 

因此,可能如果你真的發現你們沒有列出的選項是細跟你,你可以添加一個類別UIWebView和一個便捷構造做自動釋放工作適合你:

self.webView = [UIWebView webViewWith......]; 
+1

請記住,第三個選項不釋放的'webView'以前的值。這將是我在初始化程序中的首選選項,因爲在初始化程序中不會使用訪問程序,但在其他方法中不需要確保釋放先前的值。 – albertamg

+0

同意,這就是爲什麼我寫道:「特別是當它屬於初始化方法時......」您的評論使我的意思完全清楚,儘管我表達得不是那麼好...... :-)所以你離開了用便利的構造函數選項...:-) – sergio

+0

我寫評論的時候還沒有看到過你的編輯。我只是想說清楚:) – albertamg

相關問題