2009-08-19 3 views
0

私はEXC_BAD_ACCESSエラーになり、いくつかのコードを持っている:メモリー質問

recordIDAsString = [ 
    NSString stringWithFormat:@"%i", (int)abRecord.recordID 
]; 
propertyIDAsString = [ 
    NSString stringWithFormat:@"%i", (int)abProperty.propertyID 
]; 
identifierAsString = [ 
    NSString stringWithFormat:@"%i", (int)abProperty.identifier 
]; 

recordIDAsString、propertyIDAsString、およびidentifierAsStringは、すべてのインターフェイスで定義されています。コードは編集ビューコントローラーに含まれています.3つの* AsString変数は、保存ボタンが押されるまで、値が無効になるまでうまく機能しているようです。しかし、私は次のコードがないことを発見した作業:原因となる最初のコード例では何が起こっているのか:私は唯一の私の質問があるので、私は、アロケーションまたはinitを呼び出したときにメモリを管理するために思っていた

NSString *tempRecordIDAsString = [ 
    NSString stringWithFormat:@"%i", (int)abRecord.recordID 
]; 
NSString *tempPropertyIDAsString = [ 
    NSString stringWithFormat:@"%i", (int)abProperty.propertyID 
]; 
NSString *tempIdentifierAsString = [ 
    NSString stringWithFormat:@"%i", (int)abProperty.identifier 
]; 

recordIDAsString = [tempRecordIDAsString copy]; 
propertyIDAsString = [tempPropertyIDAsString copy]; 
identifierAsString = [tempIdentifierAsString copy]; 

メモリが無効になる?

+1

これは、メソッド呼び出しのいくつかの重大な奇妙な書式設定です...しかし、それぞれの独自の。 – bbum

+1

はい、それは非常に奇妙にフォーマットされています。それは、オブジェクトに送信されるメッセージであると思われるものがコードブラケットのように見えるので、誤解を招きます。 – corydoras

+0

メッセージを複数の行に分割するにはどうしますか? – JoBu1324

答えて

3

[NSString stringWithFormat:@"%i", (int)abRecord.recordID] 

...を経て作成された文字列が...自動解放されます。それはあなたがそれを保持しない限り、次の自動解放プールで排除されます。

あなたはメモリ管理ガイドを再訪する必要があります。

http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

+0

私は値を取得した後にテンポラリストリングを必要としないので、すぐに解放するか、単にオートリリースプールを待っているのが最善でしょうか? – JoBu1324

+1

stringWithFormatが自動解放するため、解放しないでください。上記のメモリ管理ガイドを参照してください。 copy、retain、allocで所有権を取得する場合にのみ解放してください。あなたはそれをしていないので、自動解放プールにそのことをさせるべきです。しかし、あなたは[[NSString alloc] initWithFormat:]を使うことができます。そして、終了したら文字列を解放することができます。 - あなたは単純にrecordIDAsString = [[NSString alloc] initWithFormat:]を実行することができますが、recordIDAsStringがインスタンス変数であるように見えるので、deallocを解放するだけです。 – Brian

2

NSStringのstringWithFormatは簡易コンストラクタです - あなたはそれをする必要がないように、それが返されるオブジェクトは自動解放されることを意味しています。原因となる問題は、その値を保持したい場合は、その値を保持またはコピーする必要があるということです。したがって、値への参照を格納していても、retainCountをインクリメントしているわけではありません。したがって、現在の実行ループが完了すると、自動解放プールはすべてのオブジェクトにreleaseを送信し、retainCountを1減らします。retainを使用すると、retainCountを1増やすので、autoreleaseがオブジェクトを解放すると、別のリリースが送信されるまでretainCountを保持しています。これは、ある時点であなたが行う必要があります。おそらくあなたのdeallocにあります。