なぜカテゴリにインスタンス変数があるのですか?
-
21-12-2019 - |
質問
私たちは、協会的な参照を使用してカテゴリのIVARのような動作を呼び出すことができます。しかし、カテゴリで新しいアイバルを宣言できない具体的な理由は何ですか?
クラスの私有スペースに侵入するためですか?それとも他の理由はありますか?もしそうなら、それが壊れたものは何でも壊れるカテゴリでivarsを宣言する能力を示す例を感謝します。
解決
純粋な古いC構造のように、客観的Cのアイバルを考えてください。クラスのインスタンスをインスタンス化すると、その構造を保持するのに十分な大きさのメモリブロックが作成されます。
NSString
を持っているとしましょう。既存のコードがたくさんとたくさんの既存のコードは、NSString
を使用するようにコンパイルされています。このコードの多くはライブラリとフレームワークに組み込まれています。 NSString
のIVARがXバイト数を取得し、そのメモリ内のいくつかの特定のオフセットにあることを知って、コンパイルされたコードが作成されました。
今すぐあなた自身の小さなプロジェクトでは、NSString
にカテゴリを作成し、IVARを追加したいとします。理論的には、このカテゴリのヘッダーファイルを含むプロジェクト内のコードは、この「新規」NSString
(Plus Category)のサイズがX + Yバイトを取ります。これはサブクラスのようなものです。この新しくコンパイルされたコードは、追加のIVAR(S)を適切に扱う可能性があります。
しかし、プリコンパイルされたコード、ライブラリとフレームワークのすべては、追加のIVARSの知識はありません。 NSString
インスタンスがそこで作成されると、メモリはX + YバイトではなくXバイトだけです。あなたのアプリコードがその小さいメモリチャンクへの参照を取得し、そのカテゴリIvarのバイトへのアクセスを試みるので、Chaosが発生します。物事はブームに行きます。
プレーンな古いサブクラスでは、サブクラスのIVARSを使用できるコードはサブクラスのIVASを知っているために機能します。しかし、カテゴリでは、既存のコードには追加に関する知識はありません。
私は上記のすべてが主に教育を受けた推測であることを指定すべきだと思います。私は完全に間違っているかもしれません。少なくとも合理的なようです。 :)