0

編集 2: Kurt のソリューションに加えて、もう 1 つの方法があります。このページの最後、コメントの直前を見てください: http://www.friday.com/bbum/2009/09/11/class-extensions-explained/


編集: クラス カテゴリのクラス メソッドは、クラス拡張によって実装される ivar やプライベート メソッドなどのプライベート メンバーにアクセスできないようです。


この質問が以前に尋ねられて回答されていないことを願っていますが、stackoverflow と Google 検索の両方が、クラス メソッドから ivar に直接アクセスするように求める種類の質問でブラウザー ウィンドウをスパムするため、1 つを見つけることができませんでした。これは明らかに私の意図ではありません。

問題にまっすぐに、私が達成しようとしていることを要約したコードを提供します。


XYZPerson.h:

@interface XYZPerson : NSObject
@property (weak, readonly) XYZPerson *spouse;
@end

XYZPersonMariage.h:

@interface XYZPerson (XYZPersonMariage)
+(BOOL)divorce:(XYZPerson *) oneOfSpouses;
@end

XYZPersonMariage.m

+(BOOL)divorce:(XYZPerson *)oneOfSpouses
{
  XYZPerson *otherSpouse = [oneOfSpouses spouse];
  if(otherSpouse != nil)
  {
    oneOfSpouses->_spouse = nil;
    otherSpouse->_spouse = nil;
    return true;
  }
  return false;
}

読み取り専用のフラグが設定されたプロパティに対してivarが自動的に合成されないのではないかと最初に考えましたが、実際には合成されています。

では、仕事を成し遂げるにはどのような道をたどればよいのでしょうか?

4

1 に答える 1

2

メソッド+[XYZPerson divorce:]は で定義されています。これは、 の残りの部分が実装されている場所XYZPersonMarriage.mとは異なるコンパイル ユニットです。XYZPerson.mXYZPerson

このため、コンパイル時に、コンパイラは暗黙的に合成された変数+divorce:があることを知りません。_spouseわかっている限りでは、このプロパティは、実装したメソッドによってサポートされている可能性があり-spouseます。

これを回避する方法:

  • の実装を に移動+divorceXYZPerson.mます。

  • ivar に直接アクセスしないでください。ただし、実際のメソッドを介して作業を行ってください。クラスの通常のパブリック インターフェイスの一部である必要はありません。XYZPersonMarriage.mそれらは、インポートのみを行う別のヘッダー ファイルを介して公開できます。そのパターンの長所と短所の詳細については、「Objective-C プライベート メソッド」を検索してください。

于 2013-02-05T17:46:55.113 に答える