[英]Objective C: releasing objects basic questions (non-ARC)
在沒有GC的非ARC項目中,我有兩個關於內存管理的新手問題:在Objective C中,當我'自動釋放'對象並從方法返回它時,我應該在“父方法”中釋放它,調用方法重新調整對象?
第二個問題是,我從方法返回對象(fe user )(另一個對象的實例方法,fe userService )並將其保存到屬性( self.userProp , 自我實例化對象userService並調用他的方法)。 當我發布對象userService (其方法返回對象用戶 ,存儲在屬性self.userProp中 )時,它還釋放了存儲在property中的對象(對象用戶存儲在屬性self.userProp中 )。 為什么? 誰是物業中物體的擁有者?
謝謝
當我'自動釋放'對象並從方法返回它時,我應該在“父方法”中“釋放”它,調用方法重新調整對象嗎?
不,這就是原因。 讓我們按照你的說法完全布局一個例子:
-(NSObject*)someMethodThatReturnsAnAutoreleasedObject {
return [[[NSObject alloc]init]autorelease];
}
-(void)myMethod {
NSObject *obj = [self someMethodThatReturnsAnAutoreleasedObject];
[obj doSomething];
[obj release] //PROBLEM!
}
一步一步地查看對象的保留計數,你會看到雖然-autorelease
可能不會立即給你帶來問題,但它會在以后某個時候(因為-autorelease
對象不是“自動 -釋放“,而不是當他們的擁有池被排空或解除分配時,他們被大量釋放)。 返回自動釋放對象的方法返回它,最終保留計數為0(0(開始)+ 1(alloc) - 1(自動釋放)),因此釋放它不僅不必要,而且會導致崩潰。
第二個問題是,我從方法返回對象(fe user)(另一個對象的實例方法,fe userService)並將其保存到屬性(self.userProp,自我實例化對象userService並調用他的方法)。 當我發布對象userService(其方法返回對象用戶,存儲在屬性self.userProp中)時,它還釋放了存儲在property中的對象(對象用戶存儲在屬性self.userProp中)。 為什么? 誰是物業中物體的擁有者?
再次,先進行一點設置(這首先是相當復雜的,但是在你看到你正在做的事情之后完全有意義)。
-(NSUserService*)someMethodThatReturnsAnAutoreleasedObject {
return [[[NSUserService alloc]init]autorelease];
}
-(void)myMethod {
self.userservice = [self someMethodThatReturnsAnAutoreleasedObject];
[obj doSomething];
[obj release] //No problem, assuming userService is declared retain or strong.
}
那么,為什么會有所不同呢? 記憶限定符,這就是原因! 聲明屬性時,聲明一組內存限定符以告訴編譯器要將哪種修飾符附加到賦值符號。 大多數屬性被聲明為retain
或strong(在ARC下),如果它們是對象類型,希望你的userService
被聲明為這樣,這使編譯器解釋
self.userservice = [self someMethodThatReturnsAnAutoreleasedObject];
如
self.userservice = [[self someMethodThatReturnsAnAutoreleasedObject]retain];
因此,您必須釋放它,否則您的手上有泄漏(0(開始)+ 1(分配) - 1(自動釋放)+ 1(保留)= +1)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.