2010-12-05 17 views
0

次のコードは、AppleのGKRocket iPhoneのデモアプリからである:質問については、オブジェクトのリリース

- (void) peerListDidChange:(SessionManager *)session; 
{ 
    NSArray *tempList = peerList; 
    peerList = [session.peerList copy]; 
    [tempList release]; 
    [self.tableView reloadData]; 
} 

tempListが本当に解放する必要がある場合、私はObjective Cのに新しいですし、不思議でしたか?私の本能は、それがポインタを保持していないためではないと私に伝えます。たぶん私は全体の画像を見ていないでしょう。

リリースが必要な場合は、より多くの経験をお持ちの方に理由を説明してください。

ありがとう!

答えて

1

以前はそのサンプルプロジェクトを使用していませんでした。

古いpeerList配列が作成されるまで、新たなポインタは、tempListと呼ばれる:

NSArray *tempList = peerList; 

コードがsession.peerListのコピーを作成し、その新しいコピーにpeerListポインタを割り当てます。

peerList = [session.peerList copy]; 

実際にtempListが指し示す古いpeerListを安全に解放することができます。

[tempList release]; 

すぐに[session.peerList copy];を割り当てられていた場合、古い配列は、これ以上保持ポインタが残っていないだろう、それが自動解放されなかった場合には、メモリリークになります。

あなたがtempListを割り当てたが、それをリリースしていなかった場合、それは同じ理由でメモリリークが発生しますが、tempListの目的は純粋にそうプログラムは、あなたがとにかくreleaseを呼び出すときに解放するために知っているされています。

+0

なぜ、今すぐリリースする必要があるのか​​分かります。ありがとうございました! – Unikorn

+0

それだけでは意味がありません: if(peerList)[peerList release]; peerList = [session.peerListコピー]; – Unikorn

+0

@Unikorn:多分。 – BoltClock

0

このプロジェクトの最新バージョンは、コードのこの時点で実際にクラッシュします。 session.peerListはNSMutableArrayで、tempListに割り当てようとするとアプリケーションがクラッシュします。クラッシュを止めるコードを修正しました。これはpeerListの宣言です:

@interface GameLobbyController : UITableViewController <UITableViewDelegate, UITableViewDataSource, SessionManagerLobbyDelegate, UIAlertViewDelegate> { 
NSMutableArray *peerList; 
UIAlertView *alertView; 
SessionManager *manager;} 

これはpeerListDidChange方式の新バージョンです:

- (void) peerListDidChange:(SessionManager *)session;{ 
peerList = session.peerList; 
[self.tableView reloadData];} 

わからないが、私はすべてのことtempListコードが変更可能なのにスイッチを処理するために、単純だったと思います固定配列。明らかに、私はなぜpeerListプロパティが可変ではなく固定されることが重要であったのか理解できません。すべてのコメントは大歓迎です。

+0

peerListが自動解放でないものを指していると、メモリリークが発生する可能性があります。 – Unikorn

+0

ありがとう - 私はそれを変更しました:NSArray * tempPeerList = [session.peerList copy]; peerList = tempPeerList; ARCのために私はまだ "リリース"を使用させません – Tim