連想参照を使用して、カテゴリで ivar のような動作を呼び出すことができることを理解しています。しかし、カテゴリで新しい ivar を宣言できない理由は何ですか?
クラスのプライベート空間に侵入してしまうからでしょうか。それとも他に理由がありますか?はいの場合、カテゴリで ivar を宣言する機能を示す例をいただければ幸いです。
連想参照を使用して、カテゴリで ivar のような動作を呼び出すことができることを理解しています。しかし、カテゴリで新しい ivar を宣言できない理由は何ですか?
クラスのプライベート空間に侵入してしまうからでしょうか。それとも他に理由がありますか?はいの場合、カテゴリで ivar を宣言する機能を示す例をいただければ幸いです。
Objective-C の ivar を単純な古い C 構造のように考えてください。クラスのインスタンスをインスタンス化すると、その構造を保持するのに十分な大きさのメモリ ブロックが作成されます。
あなたが持っているとしましょうNSString
。多くの既存のコードがコンパイルされて使用されますNSString
。このコードの多くは、ライブラリとフレームワークに組み込まれています。そのコンパイルされたコードは、ivar がNSString
X バイト数を取り、そのメモリ内の特定のオフセットにあることを認識して作成されました。
ここで、自分の小さなプロジェクトで、カテゴリを作成しNSString
、ivar を追加したいとします。理論的には、カテゴリのヘッダー ファイルをインクルードするプロジェクト内のすべてのコードは、この「新しい」NSString
(プラス カテゴリ) のサイズが X + Y バイトであることを認識します。これはサブクラスによく似ています。この新しくコンパイルされたコードは、追加の ivar を適切に処理できます。
しかし、事前にコンパイルされたコード、ライブラリ、およびフレームワークのすべては、追加の ivar を認識していません。インスタンスがそこに作成されるとNSString
、メモリは X + Y バイトではなく、X バイトだけになります。アプリ コードがメモリの小さなチャンクへの参照を取得し、カテゴリ ivar のバイトにアクセスしようとすると、混乱が生じます。物事はブームになるでしょう。
単純な古いサブクラスでは、サブクラスの ivar を使用できるすべてのコードがサブクラスの ivar を認識しているため、うまくいきます。しかし、カテゴリがある場合、既存のコードは追加を認識せず、追加のためのスペースを適切に作成しません。
上記のすべてが主に経験に基づいた推測であることを明記する必要があると思います. 私は完全に間違っている可能性があります。少なくとも合理的なようです。:)