0

アナライザでコンパイルすると、いくつかのメッセージが表示されます。Analyzerからの「Incorrect decrement」および「Potential leak」メッセージ

@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'を使うべきです。 –

+0

お気軽に、ありがとうございます。 –

+0

私はクラスのインスタンスで無制限チェックをしている場合は、家庭でそれを駆動するには、 "== Nil"を使うことは "== nil"と同じではありませんか? –

答えて

4

あなたの問題はここにある:

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

あなたがオブジェクトを作成し、それらを保持(なぜならプロパティ宣言の)ので、1つのオブジェクトのみがそれらを参照しているとき、彼らは、2の参照カウントを持っています。

あなたはこのようにそれを行う必要があります: `Nil`は、クラスポインタのリテラルNULLであることを

-(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'を使用してください。 –

+2

オートリアーゼはすべて私にとって怠惰な練習のようです。確かに、時には必要ですが、あなたの記憶を直接管理する方が常に良いです。 – EmilioPelaez

+0

そして、いつもより良いのは...? –

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のカウントを保持するが、唯一のautorelease修正、それを使用して、なぜだ1の保持カウントを持っている必要があります。

同じ理由で[self.syncAndCartOne release]を行うべきではありません。プロパティにnilを割り当てると、セッターメソッドは古いオブジェクトreleaseを送信します。

+0

驚くべきことに、私は二重のままで、= nil呼び出しで冗長な行を作成しているように見えます。私は受け入れられた答えとして2つを設定することができたらいいと思います... –