1

私はobjective-Cを学んでおり、拡張機能を使用してプライベートメンバーをインターフェースに追加できることを知っています。

しかし、本は () には何もないはずだと言った

次のコードスニペットを読みました

@interface Tree(Private)
- (void)blah:(int)num;
@end

() の中になぜ Private があるのか​​不思議です。

4

4 に答える 4

2

クラス カテゴリの宣言には、通常、そのカテゴリの目的を示す任意の名前を付けることができます。

したがって、あなたの場合、コードの作成者は、これらのメソッドがクラス自体の内部使用のためのものであり、他のクラスから呼び出されることを意図していないことを伝えたかったのです

于 2013-07-18T15:05:11.250 に答える
1

あなたの例の宣言は、正確にはカテゴリと呼ばれます(拡張ではありません)。

任意のクラスに好きなだけカテゴリを追加できます (ソース コードにアクセスできない場合でも)。カテゴリを使用すると、新しいメソッドをクラスに追加できますが、新しい ivar やプロパティを追加することはできません。[1]

各カテゴリには名前があり、これは括弧の間のビットです。同じクラスに同じ名前の2 つの異なるカテゴリがあってはなりません。

名前が空の場合、これはextensionと呼ばれます。拡張機能には、カテゴリとの若干の違いがあります。拡張機能に ivar とプロパティを追加でき、ソース コードにアクセスできるクラスにのみ使用できます。[1]

通常、拡張機能(本の例のように) はファイルの先頭で宣言され、.mそのファイル (通常は単一のクラスで構成される) 内でのみ使用されるメソッド、ivar、および/またはプロパティを宣言するために使用されます。

PD:拡張機能ではなくカテゴリを通じて新しいプロパティを本当に追加したい場合は、関連付けられたオブジェクトを使用して実際に行うことができます [2][3]。

  1. http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html
  2. iOS クラス拡張でのプロパティの定義
  3. http://oleb.net/blog/2011/05/faking-ivars-in-objc-categories-with-associative-references/
于 2013-07-18T15:09:03.137 に答える
0

カテゴリと見なされる場合ですが、.m ファイル上にあるため、同じ効果があります。Xcode からのヒントも参照できます。

ここに画像の説明を入力

中間のものであることTree(description)は、最後のもののようなものと考えられていましたTree ()

于 2013-07-18T15:05:41.563 に答える
0

ここには、クラス カテゴリとクラス拡張という 2 つの密接に関連する概念があります。クラス カテゴリは、括弧内に名前を含み、既存のクラスにメソッドを追加したり、メソッドを論理グループに編成したりするために最も一般的に使用されます。クラス拡張は、クラスの内部実装を拡張します (つまり、プライベート プロパティ、メソッドなどを定義するために使用されます)。

詳細については、Apple の開発者サイトをご覧ください。

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html

于 2013-07-18T15:08:53.723 に答える