2009-05-18 7 views
7

Obj-C 2.0ではカテゴリのプロパティを宣言できますが、コンパイラはカテゴリ内のアクセサの合成を拒否します。どうして?カテゴリ内のアクセサーを@synthesizeできないのはなぜですか?

(場合によっては、バッキングiVarsがクラス宣言に入っていても、関連するものをカテゴリにまとめることが組織にとって意味をなさないことがあります。クラス拡張やプライベートプロパティの操作については知っていますが、ユースケース)

答えて

0

プライベートアクセサの問題については質問しています。これは非プライベートアクセスのPOVからアプローチします。

9

カテゴリは論理的にそれぞれのクラスから分離されており、バイナリファイルに別々に格納されています。内部実装では、クラス記述構造体は、最初に@implementationブロックに定義されたメソッドのリストのみを含むメソッドリストの配列を保持します。 ObjCリンカモジュールが新しいカテゴリを読み込むと、メソッドリストがその配列に追加されます。

この実装のため、カテゴリ自体はクラスのストレージにアクセスする手段がないため、そのカテゴリを変更することはできません(カテゴリがアンロードされたときの対処方法の問題もあります)。

最後に、技術的ではなく論理的な観点から、カテゴリはクラスのメモリ内構造の「所有権」を持たず、単にいくつかの新しいメソッドを関連付けるという考えがあります。プロパティ合成を完全にサポートするには、何らかの方法でクラスの記憶域を変更する必要があります。

解決策はありますか?メインの@implementationブロックの中に@synthesizeステートメントを置くか、@implementationのカテゴリの中で直接独自のアクセサを実装するだけです。

+0

もっと具体的に説明しましょう。私はいくつかのメソッドを組織化のためのカテゴリに分け、クラスを所有しているので、クラスインタフェースに適切なiVarsを追加しました。しかし、私はまだカテゴリのメソッドを@合成することはできません。 技術的な理由はありますか?私はまだ1つも見ません。 –

+0

それは本当に大きな違いはありません。あなたがクラスとカテゴリの両方の作成者であるという事実は、ランタイムによって何らかの形でエンコードされていないので、カテゴリはそれが参照するクラスのストレージ指定子に接続していない別個のエンティティです。私が言ったように、それは「保護」メカニズムのようなものです。クラスの主な@implementationブロック内の変数を@synthesizeする必要があります。 –

関連する問題