iOS 详解NSObject协议
2017-05-08 14:01
260 查看
协议就是一组接口的集合,遵守一个协议之后就拥有的该协议中所有方法的声明。NSObject这个类遵守了NSObject协议,并且实现了NSObject协议里的所有方法,所以NSObject类及其子类都可以调用这些方法。本文主要介绍NSObject协议里的方法。
(1)
"=="判断是否是同一个对象,比较的是内存地址。"isEqual"判断两个对像是否相同,比较的是成员变量的值是否相同。
(2)
Hash Table的key,用于set和dictionary,默认是对象在内存中的地址,保证了唯一性。
(3)
对象的父类, NSObject实例的superclass为NULL。
(4)
获得对象的类。‘+(Class)class;’获得的是类对象的元类;
(5)
获得对象自己。
(6)
是对象调用某个方法,object是参数,最多有两个。
(7)
是否是NSProxy的实例;NSObject是大多数类的基类,例外一部分就是NSProxy的实例了。NSProxy是一个非常神奇的类,可以用来模仿多继承,因为他可以转发消息,指定一个实例执行消息。
(8)
判断某个对象是否是某个类或者子类的实例。
(9)
判断某个对象是否是某个类的实例.
(10)
判断某个实例是否遵守协议,是否实现了协议里的方法不一定。这个方法只能判断是否声明了协议了里的方法,是否实现得用"respondsToSelector"判断。
(11)
是否响应了某个方法。代理传值之前,必须判断是否是响应了协议里的方法,否则会崩溃。
除了NSObject协议,其他所有的协议都必须得遵守NSObject协议。这是为什么呢?如果不遵守会怎样?我可以明确的告诉你,会崩溃,会报"unrecognized selector sent to instance 0x15d78700"错误。因为代理调用了NSObject协议里的方法。声明代理的时候是id类型的,不确定是NSObject的实例,所以不能调用NSObject协议里的方法。
(12)
现在都是ARC了,还调用MRC才能使用的方法,真是太落伍了。
(13)
description是代码打印输出实例的时候调用的方法,debugDescription是控制台也就是po的时候输出实例的时候调用的方法,都可以自定义。其实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协议里的方法都可以根据自己的需求自定义。
相关文章推荐
- iOS中NSObject的两种含义:类和协议详解
- iOS SDK详解之NSCopying协议
- IOS开发之NSObject协议类方法说明
- iOS NSObject Class 详解
- iOS WebSocket数据包协议详解
- iOS学习——(转)NSObject详解
- IOS缓存机制详解 NSCoding协议方法 Core Data 原始的SQLite
- ios开发 之 NSObject详解
- ios开发 之 NSObject详解
- iOS SDK详解之NSCoding协议
- iOS swift学习之入门详解(协议和扩展)
- iOS和JS交互教程之WKWebView-协议拦截详解
- 网络编辑基础:对HTTP协议的头信息详解
- 《TCP/IP 详解 卷1:协议》的读书体会
- 路由器原理和路由协议、算法详解(3)
- 网络编程基础:对HTTP协议的头信息详解
- SOCKS 5协议详解
- Google SiteMap的作用及协议格式详解
- 网络编辑基础:对HTTP协议的头信息详解
- 路由器原理和路由协议、算法详解(4)