質問

次のように番号を定義しています:

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/

もちろん、最終的なリファレンスはメモリ管理プログラミングガイドココア

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top