NSObject易誤解處

1.isKindOfClass與isMemberOfClass,都是對象方法 框架

前者判斷是否該類或其子類,後者只判斷是否該類。 spa

BOOL c1 = [[NSMutableArray array] isKindOfClass:[NSArray class]];//yes
	BOOL c2 = [[NSMutableArray array] isMemberOfClass:[NSArray class]];//no

2.conformsToProtocol有類方法有對象方法,檢查是否聽從某協議,與是否實現改協議無關 debug

一個接收者聽從一個協議,能夠是直接接受這個協議,也能夠繼承一個已經接受這個協議的類 code

BOOL c3 = [[NSArray array] conformsToProtocol:@protocol(UITabBarControllerDelegate)];//no
		BOOL c4 = [[NSArray class] conformsToProtocol:@protocol(NSObject)];//yes



3.class和superclass和isSubclassOfClass   description和debugDescription

Class class1 = [NSArray class];
		Class class2 = [NSArray superclass];
		NSArray *array = @[@"ddss", @"dsdd", @"dfsdds"];
		NSLog(@"\n%@\n%@", [array description], [array debugDescription]);
		BOOL c5 = [[NSMutableArray class] isSubclassOfClass:[NSMutableArray class]];//yes



4. isProxy,判斷一個方法是否繼承於NSProxy,是返回yes,不是返回no,繼承與NSObject調用該方法都返回no。

官網Cocoa框架有以下介紹:Cocoa supplies two root classes:NSObject and NSProxy. 這就解釋了你的所謂的「幾乎」。剩下不繼承NSObject的都繼承NSProxy,由於NSProxy的應用比較特殊,在Cocoa程序中比較少見,具體的例子能夠參考官方API說明文檔中關於NSProxy類的介紹,裏面講到了一些例子,好比NSDistantObject
BOOL c6 = [[NSMutableArray array] isProxy];//no



5. isEqual必須所有等, 而hash值返回色是一個整,這個說實話不理解,有知道望解答下。
NSArray *arr = @[@"ddd", @"ddd"];
		NSArray *arr1 = @[@"ddd", @"ddd", @"ddd"];
		BOOL c7 = [arr isEqual:arr1];
		NSUInteger hash1  = [arr hash];
		NSUInteger hash2 = [arr1 hash];
		NSDictionary *dic1= @{@"ddd":@"dd", @"ddf":@"ffff"};
		NSDictionary *dic2= @{@"ddd":@"ff", @"ddf":@"ffffff"};
		NSUInteger hash3 = [dic1 hash];
		NSUInteger hash4 = [dic2 hash];


6.內省(Introspection) orm

內省(Introspection)是面嚮對象語言和環境的一個強大特性,Objective-C和Cocoa在這個方面尤爲的豐富。內省是對象揭示本身做爲一個運行時對象的詳細信息的一種能力。這些詳細信息包括對象在繼承樹上的位置,對象是否遵循特定的協議,以及是否能夠響應特定的消息。NSObject協議和類定義了不少內省方法,用於查詢運行時信息,以便根據對象的特徵進行識別。 對象

明智地使用內省能夠使面向對象的程序更加高效和強壯。它有助於避免錯誤地進行消息派發、錯誤地假設對象相等、以及相似的問題。 繼承

總結:

經過NSObject,其它類繼承了一些基礎的與Objective-C語言編譯器系統之間的接口,而且得到了在它的實例中表現爲一個對象的能力。 接口

相關文章
相關標籤/搜索