0

當我用分析儀進行編譯時,我收到了一些消息。我有這些性能聲明:來自分析儀的「不正確的遞減」和「潛在泄漏」信息

@property (nonatomic, retain) SyncServicePrimary *syncAndCartOne; 
@property (nonatomic, retain) SyncServiceSecondary *syncAndCartTwo; 

這種方法是從applicationDidBecomeActive叫和我「分配的對象的潛在泄漏」。

-(void)makeTheCartObjectsForCountry:(NSString*)country_key{ 
    self.syncAndCartOne = [[SyncServicePrimary alloc] init]; 
    self.syncAndCartTwo = [[SyncServiceSecondary alloc] init]; 
} 

這被稱爲applicationWillResignActive;在這裏我得到「對象的引用計數的錯誤遞減」。

-(void) removeTheCartObjects{ 
    [self.syncAndCartOne release]; 
    self.syncAndCartOne = Nil;  
    [self.syncAndCartTwo release]; 
    self.syncAndCartTwo = Nil; 
} 

如果我設置的對象autorelease,錯誤消失,但我想,當應用程序隱藏本身被釋放的對象。

這是我正在做的事情,但這是分裂太遠,分析儀看到開始和結束,或者這是我可以做得更好/正確的東西,所以它不會抱怨?

它很可能是我錯過了一個關於releasealloc週期(我來自PHP和C#)的簡單概念。

+2

注意'Nil'是空字面類指針。對於對象指針,你應該使用'nil'來代替。 – 2011-10-26 04:46:39

+0

很高興知道,謝謝。 –

+0

只是在家裏駕駛它,如果我正在做一個類的實例的零檢查;使用「==無」與「==無」是不一樣的? –

回答

4

你的問題是在這裏:

-(void)makeTheCartObjectsForCountry:(NSString*)country_key{ 
    self.syncAndCartOne = [[SyncServicePrimary alloc] init]; 
    self.syncAndCartTwo = [[SyncServiceSecondary alloc] init]; 
} 

要創建的對象,然後留住他們(因爲財產申報),所以他們有2引用計數,當只有一個對象引用它們。

你應該做的是這樣的:

-(void)makeTheCartObjectsForCountry:(NSString*)country_key{ 
    SyncServicePrimary *primary = [[SyncServicePrimary alloc] init]; 
    self.syncAndCartOne = primary; 
    [primary release]; 

    SyncServiceSecondary *secondary = [[SyncServiceSecondary alloc] init]; 
    self.syncAndCartTwo = secondary; 
    [secondary release]; 
} 
+0

或使用'-autorelease'。 – 2011-10-26 04:46:00

+2

自動釋放一切對我來說似乎是一種懶惰的做法。當然,有時候這是必要的,但直接管理你的內存總是更好。 – EmilioPelaez

+0

它總是更好,因爲...? – 2011-10-26 05:12:31

2

您已經定義的屬性retain的屬性,所以分析假定該屬性的設置方法如下:

- (void)setSyncAndCartOne:(SyncServicePrimary *)newValue 
{ 
    [newValue retain]; 
    [self->_syncAndCartOne release]; // access the instance variable holding the property value 
    self->_syncAndCartOne = newValue; 
} 

如果使用@synthesize,setter方法會像她那樣。

所以,當makeTheCartObjectsForCountry:回報,在syncAndCartOne對象有保留的2計數,但應該只有1。這就是爲什麼使用autorelease修復它保留計數。

出於同樣的原因,您不應該這樣做[self.syncAndCartOne release]。當您將nil分配給屬性時,setter方法將發送舊對象a release

+0

太棒了,所以它看起來像我是雙重保留和創建一個冗餘線與=零調用。希望我可以設置兩個作爲接受的答案... –