0

みなさん、メモリリークを見つけるのに苦労しています。それらを解放すると、すべての保持カウント= 0になりますが、それでも次のコードからのリークにフラグを立てています。

- (GKSession *) peerPickerController:(GKPeerPickerController *)picker sessionForConnectionType:(GKPeerPickerConnectionType)type {
inSession = [[GKSession alloc] initWithSessionID:gameSessionID displayName:nil sessionMode:GKSessionModePeer];
printf( "insession alloc on Start: %i\n", [inSession retainCount] );
return inSession;

}

ピア ピッカーをキャンセルして、接続先が見つからない場合は、このコードを実行して、ピア ピッカーに関するすべてを削除します。

- (void)peerPickerControllerDidCancel:(GKPeerPickerController *)picker { 
picker.delegate = nil;
mpicker.delegate = nil;
inSession.delegate = nil;
gameSession.delegate = nil;

if(inSession != nil) {

    [self invalidateSession:inSession];
    [inSession release];
    inSession = nil;

}

[picker release];

picker = nil;
mpicker = nil;



[inSession release];


if(self.gameSession != nil) {
    [self invalidateSession:self.gameSession];
    [self.gameSession release];
    self.gameSession = nil;
}

[self.gameSession release];
self.gameLabel.hidden = NO;
self.gameState = pongStateStartGame;


[gameSession release];
[inSession release];

[inSession dealloc];
[gameSession dealloc];



[mpicker dealloc];

}

どこかで、コードが漏れていて、どこにいるのか一生わかりません。これに関するヘルプは驚くほど高く評価されます。

4

5 に答える 5

3

Instrumentsを使用して漏れを見つけます。

問題は、Cocoa のメモリ管理をまだ理解していないことです。

[inSession dealloc];
[gameSession dealloc];
[mpicker dealloc];

自分自身に電話する必要はありません-deallocNSObject参照カウントが 0 に達したときにこれを呼び出します。

メモリを管理する正しい方法を学ぶようにしてください。

于 2009-10-08T16:38:20.847 に答える
2

Xcode 3.2 の Build と Analyze を実行することを検討してください (Build メニューの下)。これは、参照カウントの問題を見つけるのに非常に役立ちます。

それでも問題が解決しない場合は、Instruments で Leaks ツールを実行します (Run->Run With Performance Tool->Leaks)。

于 2009-10-08T16:33:24.600 に答える
0

変数ポインタをnilに設定した後、もう一度リリースしようとしても役に立ちません。何もしません。また、deallocを呼び出さないでください。技術的には法律に違反していませんが、

- (GKSession *) peerPickerController:(GKPeerPickerController *)picker sessionForConnectionType:(GKPeerPickerConnectionType)type

メソッドは、この種のリークにつながる可能性のあるスタイルの断片性を示します。新しいGKSessionを作成し、それをインスタンス変数に設定して、それへの参照を返します。どちらの引数も使用しません。インスタンス変数を作成するか、自動リリースして返します。このメソッドを呼び出すコードはどこにありますか?発信者は戻り値を保持していますか?

于 2009-10-08T16:44:44.327 に答える
0

コードの 2 番目のビットでは、 [inSession release]2 回、THENを実行deallocします。

申し訳ありませんが、これは約 200 種類の間違いです。

電話をかけないdeallocシステムが自動で電話をかけます。

release同じメソッドで同じオブジェクトを 2 回呼び出さないでください。最初の呼び出しの後、オブジェクトがまだ存在するかどうかはわかりません。オーバーリリースの例外が発生していないことに驚いています。リークはありません。

保持と解放の使用に関する簡単な説明については、この質問を参照してください。

より詳細な説明 (および非常に価値のある) については、この件に関する Cocoa のドキュメントを参照してください。

于 2009-10-08T16:49:38.047 に答える
0

メモリの問題を特定するのに「役立つ」ために [x preserveCount] を使用することについてのコメントです。私はこれを学び、何度か試してみましたが、これは正しい状況を反映していない可能性があります。したがって、この値に依存しないでください - これを使用しないでください - おそらく混乱を招くでしょう。

第二に、私は常に Apple コードを使用しており (もちろん、この例では機能します)、「突然」コードに問題が発生します (LEAKS Instrument に表示されます)。 " もちろん。時々、私は何時間も費やして、奇妙な行動の最も奇妙な理由を見つけます。たとえば、応答するプロトコルとして UINavigationControllerDelegate を追加するだけで、他のコード行を変更していなくても、コードが突然リークする可能性があります。

于 2010-08-10T21:42:43.813 に答える