[英]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.