0

私がやりたいのは、カテゴリのメソッドをプライベート メソッドとパブリック メソッドに分けることです。プライベート メソッドは、そのカテゴリの file の外に表示される必要がありますが、クラスの外には表示されません。

たとえば、次のファイルがあるとします。

ClassA.m
ClassA.h // <-- Includes definitions of public category methods
ClassAPrivates.h // <-- Includes definition of private category methods.
ClassA+Render.m

ClassAPrivates.h次のようになります。

@interface ClassA()
// private methods here, for use inside ClassA
@end
@interface ClassA(Render)
// the private methods of the Render category.
-(void)privateConfigureDeviceContext;
-(void)privateConfigureBufferSpace;
@end

「ClassA.h」は次のようになります。

@interface ClassA : NSObject
// public methods of ClassA
@end
@interface ClassA (Render)
// public methods of category Render
-(void)drawLine;
-(void)drawCircle;
@end

ただし、XCode は Render のインターフェイスが重複していると文句を言います。回避策はありますか?

4

4 に答える 4

1

プライベート メソッド用に別のカテゴリを作成する必要はありません。

3 つのシナリオがあります。

  1. ClassA+Render.mで定義されているプラ​​イベート メソッドへのアクセスClassA.m
  2. ClassA.mで定義されているプラ​​イベート メソッドへのアクセスClassA+Render.m
  3. ClassA+Render.mで定義されたプロパティへのアクセスClassA.m

注: 元のポスターはシナリオ 3 を要求していませんが、便利になると思いました

ClassA.m2 つのプライベート メソッドを定義します

  • basePrivateMethod1- これは呼び出しますrenderPrivateMethod1
  • basePrivateMethod2

ClassA+Render.m2 つのプライベート メソッドを定義します

  • renderPrivateMethod1
  • renderPrivateMethod2- これは呼び出しますbasePrivateMethod2

シナリオ 1

  • 拡張機能を作成し、ClassA+Render.m使用するメソッドを前方宣言するだけです。

ClassA+Render.m

@interface ClassA ()

- (void) basePrivateMethod1; //Just forward declare the method

@end

シナリオ 2

  • ClassA+Render.h定義されているメソッドを宣言するだけClassA+Render.mです。
  • ( )ClassA.mだけを含める#importClassA+Render.h
  • Pls は注意してくださいClassA+Render.hClassA

ClassA+Render.h

@interface ClassA (Render)
{
    - (void) basePrivateMethod2;
}

シナリオ 3

  • Pls note - カテゴリでプロパティを定義/作成することはできません
  • という新しいカテゴリを作成しますClassA+Properties
  • すべてClassA+Properties.hのプロパティを再宣言します
  • これらのプロパティの実際の定義が他の場所にあることをコンパイラに伝えるために、すべてのプロパティにClassA+Properties.m使用されます。@dynamic
  • ClassA+Render.minclude ( #import)で、ClassA+Properties.hすべてのプロパティにアクセスできるようにする

ClassA+Properties.h

@interface ClassA (Properties)
{
    @property NSUInteger property1;
    @property NSUInteger property2;
}

ClassA+Properties.m

@interface ClassA (Properties)
{
    @dynamic property1;
    @dynamic property2;
}
于 2013-01-25T02:13:07.567 に答える
0

カテゴリは、新しいメソッドを既存のクラスに追加でき、すべてのサブクラスが最終的にそのメソッドを取得することを示す概念です。

カテゴリを使用して、サブクラス化せずに、既存のクラスの追加のメソッドを定義します。ソースコードが利用できない場合でも同様です。通常、カテゴリを使用して、Cocoaフレームワークで定義されているクラスなどの既存のクラスにメソッドを追加します。追加されたメソッドはサブクラスに継承され、実行時にクラスの元のメソッドと区別できません。

プライベートメソッドを追加する場合、なぜカテゴリを使用するのですか?その単一のクラスファイル自体でのみ使用できるため。したがって、通常のプライベートメソッドを作成しないのはなぜですか!!!

于 2012-12-07T09:29:36.120 に答える
0

Renderonという名前の 2 つのカテゴリを宣言しClassAます。そのため、Xcode は不平を言っています。

于 2012-12-07T09:09:40.297 に答える
0

独自のファイル内のクラス拡張で Render のプライベート メソッドを宣言できます。これは、複数のクラス拡張を持つことができることを利用しています。

ClassA.h:

@interface ClassA : NSObject
// public methods of ClassA
@end

ClassA+Render.h:

@interface ClassA (Render)
// public methods of category Render
-(void)drawLine;
-(void)drawCircle;
@end

ClassA+Render_Private.h:

@interface ClassA ()
// the private methods of the Render category.
-(void)privateConfigureDeviceContext;
-(void)privateConfigureBufferSpace;
@end
于 2012-12-07T08:51:48.103 に答える