簡體   English   中英

目標C:發布對象基本問題(非ARC)

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

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