カテゴリとクラス拡張の違いは何ですか。どちらも既存のクラスにカスタムメソッドを追加するために使用されていると思います。誰かがこれに光を当てることができますか?コードによる例証は本当にありがたいです。
カテゴリとクラス拡張の違いは何ですか。どちらも既存のクラスにカスタムメソッドを追加するために使用されていると思います。誰かがこれに光を当てることができますか?コードによる例証は本当にありがたいです。
回答:
カテゴリは、既存のクラスにメソッドを追加する方法です。これらは通常、「NSView + CustomAdditions.h」(もちろん.m)などの「Class + CategoryName.h」というファイルにあります。
クラス拡張は、2つの主な違いを除いて、カテゴリです。
カテゴリに名前はありません。次のように宣言されます。
@interface SomeClass()
- (void) anAdditionalMethod;
@終わり
拡張機能の実装は、ファイルのメインの@implementationブロックにある必要があります。
.mファイルの先頭にクラス拡張子があり、クラスのメソッドをさらに宣言しているのはよくあることです。これらのメソッドは、以下のクラスのメインの@implementationセクションに実装されています。これは、「pseudo-private」メソッドを宣言する方法です(pseudo-privateは、実際にはプライベートではなく、外部に公開されていないだけです)。
=> Objective Cでは、継承なしでクラスに機能を追加したい場合は、単にカテゴリを使用します。
=>独自の.hおよび.mファイルが付属しています
=>Category
プロパティではなく新しいメソッドを追加するために使用します。
-> In Objective C, when you want to make behaviour of some property private you use class extension.
-> it comes with **.h** file only.
-> mainly for properties.
注:新しいファイルを追加してObjective Cのオプションを選択すると、カテゴリは「のサブクラス」ではなく「カテゴリ」と「カテゴリオン」を表示するため、次のように表示されます。
@interface className (categoryName)
@end
- ファイル名が(className + categoryName.hおよびclassName + categoryName.m)の2つのファイル.hおよび.mを取得します。
そして拡張の場合、あなたは得るでしょう
@interface className()
@end
-あなたは通りの名前で一つだけのファイルを取得しますclassName_extensionName.h
カテゴリは、ソースコードが利用可能かどうかに関係なく、クラスにメソッドを追加する方法です。つまり、カテゴリを、のような基礎クラスNSString
や独自のカスタムクラスに追加できます。
拡張機能は、コンパイラがソースコードと拡張機能を同時にコンパイルするため、ソースコードが利用可能なクラスにのみ追加できます。
クラス拡張にはインスタンス変数とプロパティを追加できますが、カテゴリには追加できません。
拡張機能内の変数とメソッドは、継承されたクラスからもアクセスできません。
カテゴリと拡張子はどちらも基本的に大きなコードベースを処理するように作られていますが、カテゴリは複数のソースファイルでクラスAPIを拡張する方法であり、拡張子はメインインターフェイスファイルの外部に必要なメソッドを追加する方法です。
同じクラスコードを異なる機能に応じて異なるソースファイルに分割する必要がある場合はcategoryを使用し、メインインターフェイスファイルの外部の既存のクラスに必要なメソッドを追加する必要がある場合はextensionを使用します。また、クラスで公に宣言されたインスタンス変数を変更する必要がある場合(たとえば、読み取り専用から読み取り/書き込み)、拡張機能で再宣言できます。
拡張機能:メソッドをプライベートにし、Appleクラスではなく独自のカスタムクラスのプロパティを追加します。
カテゴリ:プロパティではなく既存のクラスにメソッドを追加するには、カスタムクラスとAppleクラスの両方に使用できますNSString
。
カテゴリクラスでsetAssociatedプロパティを使用してプロパティを持つこともできます。
@interface SomeClass (Private)
@property (nonatomic, assign) id newProperty;
@end
NSString * const kNewPropertyKey = @"kNewPropertyKey";
@implementation SomeClass (Private)
@dynamic newProperty;
- (void)setNewProperty:(id)aObject
{
objc_setAssociatedObject(self, kNewPropertyKey, aObject, OBJC_ASSOCIATION_ASSIGN);
}
- (id)newProperty
{
return objc_getAssociatedObject(self, kNewPropertyKey);
}
@end
参照:http://inchoo.net/dev-talk/ios-development/how-to-add-a-property-via-class-category/
@interface SomeClass ()
- (void) anAdditionalMethod;
@end
カテゴリを宣言する方法ではないと思います。カテゴリには名前が必要です
@interface SomeClass (XYZ)
- (void) anAdditionalMethod;
@end
例えば
@interface NSMutableArray (NSMutableArrayCreation)
+ (id)arrayWithCapacity:(NSUInteger)numItems;
- (id)initWithCapacity:(NSUInteger)numItems;
@end
AppleによってNSMutableArray用に宣言されました
c#、java抽象クラスに類似したios拡張または
c#、javaクラス拡張に類似したインターフェース
iosカテゴリー
カテゴリ
カテゴリは、多数のメソッドを含むファイルを作成するときに使用されるため、単一のクラスを異なるモジュールに分割する機能を提供します。また、カテゴリに変更が加えられても、コンパイラはプロジェクト全体をコンパイルするために時間を無駄にしません。 。カテゴリは、新しい変数またはプロパティを追加してその親クラスを検索することはできません。カテゴリ内のメソッドをオーバーライドすることはできますが、メソッドをさらにオーバーライドすることはできないため、お勧めできません。また、すべてのカテゴリに同じ階層レベルであるため、実行時に同じ親クラスに属する2つのカテゴリが存在する可能性があります。また、保護されたメソッドは、カテゴリを使用して作成できます。
拡張機能
拡張機能を使用すると、プロパティをオーバーライドしたり、既存の親クラスに新しいプロパティを追加したりできます。名前がなく、@ interface class()として表されるカテゴリと同じです。.mファイルが存在せず、拡張機能で宣言されたメソッドを実装する必要があります。親ファイルの@implementationで
このリンクでさらにヘルプ
これが私の理解です:
拡張機能は通常、独自の「カスタムクラス」に機能を追加するために使用されます」に。クラスの実装内で使用できるクラスインターフェイスを拡張するプライベートメソッドまたはプロパティを追加できます。
拡張機能は、クラスと同じファイル内に書き込まれます。したがって、String、Floatなどの事前定義されたタイプの拡張機能を作成することはできません。
一方、Categoriesを使用して、既存のクラスにメソッドを追加できます。例Stringクラスを拡張することで独自のメソッドを作成できます。カテゴリに追加のプロパティを作成できないことに注意してください。また、カテゴリの主な利点は、クラスが終了するファイルの外にある他のファイルにカテゴリを書き込むことができることです。
また、カテゴリを作成するときは、角かっこで囲んで名前を付ける必要があります。ただし、拡張子には名前は必要ありません。したがって、匿名カテゴリと呼ばれることもあります。