NSNumberを明示的に割り当てる必要がありますか?
-
03-07-2019 - |
質問
次のように番号を定義しています:
NSNumber *nn0 = [NSNumber numberWithInt:0];
allocなしでも正常に動作します。私の理解では、numberWithIntを使用すると、allocとinitが自動的に呼び出されます。
関数の最後でリリースしようとすると、問題が発生します:
[nn0 release];
実行時エラーが発生します。
質問:NS
解決
「便利なコンストラクター」多くのタイプでは、自動的に「自動リリース」されるオブジェクトが生成されます。 -つまり、新しいオブジェクトは現在のNSAutoreleasePoolによって保持されます。これらのオブジェクトを手動で解放する必要はありません-現在のNSAutoreleasePoolが解放/ドレインされると解放されます。
コンビニエンスコンストラクターの説明、およびこれらのメモリーを管理する方法については、このページを参照してください。
http:// www。 macdevcenter.com/pub/a/mac/2001/07/27/cocoa.html?page=3
他のヒント
コアメモリ管理ルールに従うだけです。変数、最終的に所有権を放棄する必要があります。オブジェクトの作成(alloc / new / copy)または具体的な所有権の取得(保持)によって所有権を取得します。これらのすべての場合、それをリリースする必要があります。
オブジェクトを保持する必要がある場合は、オブジェクトの所有権を取得する必要があります。したがって、このメソッドの番号のみが必要なことがわかっている場合(配列などに渡すため)、便利なメソッドを使用し、そのままにしておきます。何らかの理由(およびインスタンス変数など)で番号を保持したい場合は、安全に割り当て/初期化できます。
所有していないものをリリースすると、ランタイムエラーが発生します。
ルールは単純ですが、例外はほとんどありません:
オブジェクトを返すセレクタに「< new"、" alloc"、" retain"」という単語がある場合または「コピー」その中で、返されたオブジェクトを所有し、終了したらそれを解放する責任があります。
それ以外の場合はあなたはそれを所有していない、それを解放すべきではない。所有されていないオブジェクトへの参照を保持する場合は、そのインスタンスで-[NSObject retain]
を呼び出す必要があります。あなたは今「所有」していますしたがって、そのインスタンスは、それが完了したら、インスタンスで-[NSObject release]
を呼び出す必要があります。したがって、-[NSNumber numberWithInt:]
によって返されたインスタンスを所有していないため、完了時に -release
を呼び出さないでください。返されたインスタンスを現在のスコープを超えて(実際には現在の NSAutoreleasePool
インスタンスの有効期間を超えて)保持したい場合は、 -retain
する必要があります。
RegExの用語では、Peter Hoseyはブログ。メソッドセレクタがこの正規表現に一致する場合、返されたオブジェクトインスタンスを所有します。
/^retain$|^(alloc|new)|[cC]opy/
もちろん、最終的なリファレンスはメモリ管理プログラミングガイドココア。