iOS 详解NSObject协议
协议就是一组接口的集合,遵守一个协议之后就拥有的该协议中所有方法的声明。NSObject这个类遵守了NSObject协议,并且实现了NSObject协议里的所有方法,所以NSObject类及其子类都可以调用这些方法。本文主要介绍NSObject协议里的方法。
(1)
- (BOOL)isEqual:(id)object;
"=="判断是否是同一个对象,比较的是内存地址。"isEqual"判断两个对像是否相同,比较的是成员变量的值是否相同。
@interface Person : NSObject
@property (nonatomic, strong) NSString *father;
@property (nonatomic, assign) NSUInteger age;
@end
@implementation Person
@end
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
Person *xiaoming = [Person new];
xiaoming.father = @"laowang";
xiaoming.age = 12;
Person *xiaohong = [Person new];
xiaohong.father = @"laowang";
xiaohong.age = 12;
NSLog(@"xiaoming == xiaohong = %d",xiaoming == xiaohong);
NSLog(@"xiaohong isEqual:xiaohong = %d",[xiaohong isEqual:xiaohong]);
}
2017-05-06 09:26:51.799 OCTest[2401:832010] xiaoming == xiaohong = 0
2017-05-06 09:26:51.799 OCTest[2401:832010] xiaohong isEqual:xiaohong = 1
(2)
@property (readonly) NSUInteger hash;
Hash Table的key,用于set和dictionary,默认是对象在内存中的地址,保证了唯一性。
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"self = %ld",self);
NSLog(@"self.hash = %u",self.hash);
}
2017-05-06 09:32:01.116 OCTest[2408:832939] self = 384375648
2017-05-06 09:32:01.117 OCTest[2408:832939] self.hash = 384375648
(3)
@property (readonly) Class superclass;
对象的父类, NSObject实例的superclass为NULL。
(4)
- (Class)class;
获得对象的类。‘+(Class)class;’获得的是类对象的元类;
(5)
- (instancetype)self;
获得对象自己。
(6)
- (id)performSelector:(SEL)aSelector;
- (id)performSelector:(SEL)aSelector withObject:(id)object;
- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;
是对象调用某个方法,object是参数,最多有两个。
(7)
- (BOOL)isProxy;
是否是NSProxy的实例;NSObject是大多数类的基类,例外一部分就是NSProxy的实例了。NSProxy是一个非常神奇的类,可以用来模仿多继承,因为他可以转发消息,指定一个实例执行消息。
(8)
- (BOOL)isKindOfClass:(Class)aClass;
判断某个对象是否是某个类或者子类的实例。
(9)
- (BOOL)isMemberOfClass:(Class)aClass;
判断某个对象是否是某个类的实例.
(10)
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;
判断某个实例是否遵守协议,是否实现了协议里的方法不一定。这个方法只能判断是否声明了协议了里的方法,是否实现得用"respondsToSelector"判断。
(11)
- (BOOL)respondsToSelector:(SEL)aSelector;
是否响应了某个方法。代理传值之前,必须判断是否是响应了协议里的方法,否则会崩溃。
除了NSObject协议,其他所有的协议都必须得遵守NSObject协议。这是为什么呢?如果不遵守会怎样?我可以明确的告诉你,会崩溃,会报"unrecognized selector sent to instance 0x15d78700"错误。因为代理调用了NSObject协议里的方法。声明代理的时候是id类型的,不确定是NSObject的实例,所以不能调用NSObject协议里的方法。
@protocol PersonDelegate <NSObject>
@end
(12)
- (instancetype)retain;
- (oneway void)release;
- (instancetype)autorelease;
- (NSUInteger)retainCount;
- (struct _NSZone *)zone ;
现在都是ARC了,还调用MRC才能使用的方法,真是太落伍了。
(13)
@property (readonly, copy) NSString *description;
@optional
@property (readonly, copy) NSString *debugDescription;
description是代码打印输出实例的时候调用的方法,debugDescription是控制台也就是po的时候输出实例的时候调用的方法,都可以自定义。其实NSObject协议里的方法都可以根据自己的需求自定义。