isMemberOfClass、isKindOfClass原則分析

isMemberOfClass

-発信者がオブジェクトクラスのインスタンスを渡す必要がYES戻らない
-着信オブジェクトインスタンスの発信者か否かを判断する、など、後方ない:もしP1がオブジェクトS1のインスタンスであることを意味し、[S1 isMemberOfClass P1]
-何度も繰り返し、親クラス再帰検索を決定します

出典:

+ (BOOL)isMemberOfClass:(クラス)CLS {
     戻り object_getClass((ID)自己)== CLS。
}
 - (BOOL)isMemberOfClass:(クラス)CLS {
     戻り [自己クラス ] == CLS。
}

二つの方法、クラスメソッド、オブジェクトメソッド、2つの違いがあります。

 -方法の例:オブジェクトが決意を移動し、オブジェクトクラス取得のインスタンスである
 -メソッドオブジェクト:オブジェクトが達成されるメタクラスオブジェクトが再び決定されます

サンプルコード:

* = P1 XPerson [XPersonアロケーション]のinit]; 
XStudent * S1 = [[XStudentアロケーション]のinit]; 

// trueに(S1クラスのオブジェクトと[S1クラス】決意、肯定的と同じである) 
のNSLog(@ " S1 S1はある例かどうか:%のI "、[isMemberOfClass S1:S1のクラス]]);
 // 真([S1クラス]および[XStudentクラス】同等物、唯一のクラスは、クラスのオブジェクト、メタクラスオブジェクトを有しますオブジェクトの複数のインスタンスを持つことができます) 
のNSLog(@ " s1はXStudent例の場合:%のI "、[S1 isMemberOfClass:[XStudent クラス]]);
 // !クラスオブジェクト(= S1クラスオブジェクトp1のfalseに) 
のNSLog(@ " S1かP1例:%のI "、[S1 isMemberOfClass:[P1のクラス]]);
 // 偽(前出)に
NSLog(@ " s1はXPerson例の場合:%のI "、[isMemberOfClass S1:[XPerson クラス]]); 

// 偽(基礎となる取得はメタクラスXStudentを比較することである)に(!= XStudent XStudentメタクラスオブジェクトがクラスオブジェクトです) 
NSLog("@ XStudentはXStudent例であるかどうか:%のI "、[XStudent isMemberOfClass:[XStudent クラス]]);
 // trueに(= XStudentオブジェクトXStudentメタクラスメタクラスオブジェクト) 
のNSLog("@ XStudentメタクラスインスタンスXStudentか:%はI "[XStudent isMemberOfClass:object_getClass([XStudentのクラス])]);
 // !falseに(= XPersonがオブジェクトXStudentメタクラスメタクラスオブジェクト) 
のNSLog(@" XStudent XPersonメタクラスのインスタンスかどうか:%のI "、[XStudent isMemberOfClass:

 

isKindOfClass

-発信者は、渡されたオブジェクト・クラスのインスタンスであり、または発信者が鎖クラスのオブジェクトクラス渡さ後継のインスタンスである、戻りYES
-発信者がなく、後方着信オブジェクトのサブクラスであるか否かを判断します
-裁判官を見つけるために再帰的に親ありません

出典:

+ (BOOL)isKindOfClass:(クラス)CLS {
     (クラスのTCL = object_getClass((ID)自己)のTCL;のTCL = tcls-> super_class){
         場合(のTCL == CLS)リターンYES。
    } 
    戻りNO。
}
 - (BOOL)isKindOfClass:(クラス)CLS {
     (クラスのTCLは= [自己クラス ];のTCL;のTCL = tcls-> super_class){
         場合(のTCL == CLS)リターンYES。
    } 
    戻りNO。
}

 

サンプルコード:

* = P1 XPerson [XPersonアロケーション]のinit]; 
XStudent * S1 = [[XStudentアロケーション]のinit]; 

// クラスオブジェクトと真(S1、親クラス・オブジェクト、ベースクラスオブジェクト([NSObjectクラス])へのそしてクラスオブジェクトP1、[P1クラス] S1を比較すると、親クラスのオブジェクトである) 
のNSLog(@ " かどうか、P1サブクラスS1:%のI " [isKindOfClass S1:[P1は、クラス]]);
 // trueに(同上。 [XPersonクラス]と[P1クラス]等価である) 
のNSLog(@ " かXPersonサブクラスS1:%のI "、[isKindOfClass S1:[XPerson クラス]]);
 // trueに([NSObjectクラス]がS1であります基本クラスのオブジェクト) 
のNSLog(@ " s1はNSObjectののサブクラスである場合:%のI " [isKindOfClass S1:[NSObjectのは、クラス]]); 

//偽の(親メタクラス、基底クラス(NSObjectクラス)XPersonオブジェクトを比較するためにメタクラスXStudent A) 
のNSLog(@ " XStudentかXPersonサブクラス:%のI "、[XStudentザisKindOfClass:[XPersonのクラス] );
 // trueに(メタクラスのクラスメソッドがXStudentメタクラスを比較するために取られる決意、に渡す必要があり) 
のNSLog(@ " XStudent XPerson員か否かのサブクラス:%のI "、[XStudentザisKindOfClass:object_getClass([XPerson クラス])]);
 // trueに(最上位クラスがプリミティブメタクラスである) 
のNSLog(@ " XStudent員か否かをNSObjectのサブクラス:%のI "、[XStudent isKindOfClass:object_getClass([NSObjectののクラス ])]) ;

 

おすすめ

転載: www.cnblogs.com/xgao/p/11277935.html