あなたが興味を持っている2つの方法があります:
isKindOfClass:
as は受信者にそれが classか subclassisMemberOfClass:
かを尋ねますが、asは受信者にそれが class であるかどうかを尋ねますが、 subclass ではありません。たとえば、NSManagedObject
objectClass というサブクラスがあるとします。
if([self.objectClass isKindOfClass:[NSManagedObject class]]) {
// This will return YES
}
else if ([self.objectClass isMemberOfClass:[NSManagedObject class]]) {
// This will return NO
}
objectClass は NSManagedObject のサブクラスであるため、最初のステートメントは YES (または true、または 1) を返します。2 番目のステートメントは、サブクラスではあるがクラス自体ではないため、NO (または false、または 0) を返します。
更新:この回答を更新して、以下のコメントに光を当てたいと思います。これは、次のコード行のため、この説明が間違っていると述べています。
if ([self.class isKindOfClass:self.class])
false を返します。これは正しいです。false が返されます。しかし、この例は間違っています。NSObject から継承するすべてのクラスも、NSObject プロトコルに準拠しています。このプロトコル内には、class
「受信者のクラスのクラス オブジェクトを返す」メソッドが呼び出されます。この場合、self.class はクラス オブジェクト self が何であれ返します。ただし、ドキュメントからisKindOfClass:
-
レシーバーが特定のクラスのインスタンスであるか、そのクラスを継承する任意のクラスのインスタンスであるかを示すブール値を返します。
したがって、このメッセージを (クラスである) self.class に送信すると、false が返されます。これは、クラス自体ではなく、クラスのインスタンスに送信されることを意図しているためです。
例を次のように変更すると
if([self isKindOfClass:self.class])
YES (または true、または 1) を取得します。
ここでの私の答えは、self.objectClass がobjectClass という名前のインスタンスへのアクセサーであることを前提としています。確かに、クラスのインスタンスとしてはひどい名前ですが、問題は「クラスのインスタンスにどのように名前を付けるか」ではありませんでした。