メモリ管理をシンプル化するためのアクセス・メソッドの優先選択

1916 ワード

本の中では、あるオブジェクトが使用されている場合は、使用中に破棄されないことを保証します.同じポインタが別のオブジェクトを指す場合、元のオブジェクトの所有権を放棄する必要があります.この作者は本当にばかで、いつもいくつか自分で正规の文字を书いて、実は少しも理解していないで、本を书くのは人に理解するのです!!!
デフォルトでは、属性が原子的であるatomicを宣言します.
本に書かれている内容から見るとMRC時代の理論であるはずだが、一記に値する.アクセサを実現する3つの方法:1、getter内部でretainしてからautorelease、getterは自分の属性で使用するそのオブジェクトも人に提供するので、これは共有の行為であり、MRCの産物であるため、使用者に与える前に参照カウントを+1し、それからautoreleaseを加えると放出が遅延し、周到に考えられる.しかしautoreleaseはgetterが頻繁に使用される場合、性能オーバーヘッドが大きくお得ではありません.setterで古い値を解放して新しい値を保持します.2、getterは正常に値を返しますが、setterで古い値を自動的に解放して新しい値を保持します.setterでは,属性のポインタが元の値を解放し,setterに渡された値を指す.3、getterは正常に値を返しますが、setterで古い値を手動で解放して新しい値を保持します.オブジェクトの生存期間を正確に制御でき、アクセサを頻繁に使用するシーンに適していますが、オブジェクトがすぐに解放されるため、うまくいかないとnilにアクセスする状況が発生してクラッシュします.
この著者が本を書くのは本当に時間の無駄で、彼はカウンタオブジェクトの例を挙げたが、参照カウントとは全く異なることを明確に説明していない.著者が言ったカウンタは参照カウントではなく、カウントするためのオブジェクトである.作者の言うことはここで何が違うのかよく分かりません.setterに渡された値がretainされなければ渡された値の所有権を取得できないということではないでしょうか.所有権を取得しないと何気なく釈放される可能性がありますか?そういう意味なら、もう八百回も言ったのに、例を挙げるまでもなく、別の意味を言っているのかと思った.
Initとdeallocでaccessorを使用することはできません.accessorを呼び出すことはできません.そのため、初期化方法をカスタマイズするしかありません.著者らが与えた実装は,その伝達された実パラメータをcopyし,属性に値を付与することである.最後にdeallocの時にreleaseという属性に行きます.
どのようにreset方法を実現するかMRC時代に簡単な構造関数は、retain、releaseのそれを自動的に完成させる必要はありません.どのような簡単な構造関数ですか?こうして--
[NSNumber numberWithInteger:0]

もう一つはallocで初期化することです.ああ、簡単な構造関数ではありません.
[[NSNumber alloc] numberWithInteger:0]

この場合はreleaseを必要とします.allocのときに構築されたオブジェクトの参照カウントはすでに1なので、このときポインタで指されると参照カウントは2になります.releaseを一度でなければ、参照カウントは1になり、メモリが漏れることになります.もちろん、ここで説明する手順は、
  • alloc.
  • 賦課.
  • release. しかし、これは特定の例なのか、カウントオブジェクトの例なのか、著者らはカウントオブジェクトを0に設定することで、リセットがどのように実現されるべきかを説明したいと考えている.

  • setterを使用せずに=を直接使用して値を割り当てるには、別の場所で参照カウントを制御する必要があり、うっかりするとエラーが発生しやすくなります.これは著者が推奨しないことです.
    簡単なコンストラクション関数を使用して構築されたオブジェクトは、手動でreleaseする必要はありません.releaseに行くと、すでにnilであるオブジェクトにメッセージを送信してクラッシュを引き起こす可能性があります.