簡體   English   中英

自動釋放與發布

[英]Autorelease vs. Release

鑒於這兩種情況,哪種代碼是最佳實踐,為什么?

自動釋放

loginButton = [[[UIBarButtonItem alloc] initWithTitle:@"Login" 
                                                style:UIBarButtonItemStylePlain 
                                                target:self 
                                                action:@selector(loginButtonClicked:)]
                                                autorelease];
self.navigationItem.rightBarButtonItem = loginButton;

要么

發布

loginButton = [[UIBarButtonItem alloc] initWithTitle:@"Login" 
                                                style:UIBarButtonItemStylePlain 
                                                target:self 
                                                action:@selector(loginButtonClicked:)];
self.navigationItem.rightBarButtonItem = loginButton;
[loginButton release];

對於你的例子,它並不重要。 就個人而言,我可能會使用第一種情況。 這樣您就可以在以后添加修改或調試代碼,而無需擔心移動[loginButton release]行。

使用自動釋放似乎有一種恥辱(即,盡可能優先釋放),這就是我通常走第二條路線的原因。 但是因為你不在這里循環,所以現在釋放與后續自動釋放將具有完全相同的效果(因為另一個對象保留了loginButton,它不會被dealloc()編輯)。

但是我應該指出,我的大部分內存泄漏都是由於忘記添加釋放線造成的,因此最好立即解決自動釋放問題。

卡爾說,要么你的情況都要好。 這是因為UIBarButtunItem對象保留在內存中,因為對它的一個引用保存在self.navigationItem (假設您使用self.navigationItem @property (retain)聲明了該屬性。)。 因此,通常的反對使用自動釋放池,它在內存中保留不必要的對象直到當前事件循環結束,這里不適用。

由於iPhone上的內存預算非常緊張,首選方式應該是通過顯式發布。 這樣,在runloop期間自動釋放池清空之前,對象不會停留,並且您可以盡可能減少內存占用。

由於navigationItem保留了它,因此兩者最終完全相同。 樣式方面,自動釋放首選從不在其名稱中指定alloc或copy的方法返回,但否則由您決定。 如果沒有單獨保留對象,則釋放將更快地釋放內存。

在發布后設置對nil的引用的代碼風格問題是一個相關的問題。

雖然在所提出的場景中,兩種情況是相同的,但使用版本(引用)而不是自動釋放有一點速度優勢。所以當有嚴格的性能要求時,請發布

當您向對象發送-autorelease消息時,您將其添加到列表中,並且在釋放自動釋放池時它將獲得-release消息。 -autorelease的全部目的是為您提供一種方法來平衡您的保留和釋放,而其他東西可能仍然需要您正在發布的對象,但您沒有。 在您描述的情況下,您提供的第二個示例更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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