NSObject易误解处

1.isKindOfClass与isMemberOfClass,都是对象方法

前者判断是否该类或其子类,后者只判断是否该类。

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

2.conformsToProtocol有类方法有对象方法,检查是否遵从某协议,与是否实现改协议无关

一个接收者遵从一个协议,可以是直接接受这个协议,也可以继承一个已经接受这个协议的类

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)

内省(Introspection)是面向对象语言和环境的一个强大特性,Objective-C和Cocoa在这个方面尤其的丰富。内省是对象揭示自己作为一个运行时对象的详细信息的一种能力。这些详细信息包括对象在继承树上的位置,对象是否遵循特定的协议,以及是否可以响应特定的消息。NSObject协议和类定义了很多内省方法,用于查询运行时信息,以便根据对象的特征进行识别。

明智地使用内省可以使面向对象的程序更加高效和强壮。它有助于避免错误地进行消息派发、错误地假设对象相等、以及类似的问题。

总结:

通过NSObject,其它类继承了一些基础的与Objective-C语言编译器系统之间的接口,并且获得了在它的实例中表现为一个对象的能力。








你可能感兴趣的:(NSObject易误解处)