协议就是一组接口的集合,遵守一个协议之后就拥有的该协议中所有方法的声明。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协议里的方法都可以根据自己的需求自定义。

iOS 详解NSObject协议的更多相关文章

  1. IOS详解TableView——选项抽屉(天猫商品列表)

    在之前的有篇文章讲述了利用HeaderView来写类似QQ好友列表的表视图. 这里写的天猫抽屉其实也可以用该方法实现,具体到细节每个人也有所不同.这里采用的是点击cell对cell进行运动处理以展开“ ...

  2. http协议报头详解HTTP协议结构

    http协议 请求报文和响应报文都是由以下4部分组成 1.请求行 2.请求头 3.空行 4.消息主体 下图为http请求的报文结构 下图为http响应报文结构 请求行 格式为: Method Requ ...

  3. IOS开发之NSObject协议类方法说明

    oc中NSObject类是所有类的基类,所有类都要继承自它,那么它的方法就显得特别重要,因为所有类都会有这些基本的方法. 看看oc的源码中NSObject是这样定义的: @interface NSOb ...

  4. iOS:详解MJRefresh刷新加载更多数据的第三方库

    原文链接:http://www.ios122.com/2015/08/mjrefresh/ 简介 MJRefresh这个第三方库是李明杰老师的杰作,这个框架帮助我们程序员减轻了超级多的麻烦,节约了开发 ...

  5. iOS 详解NSXMLParser方法解析XML数据方法

    前一篇文章已经介绍了如何通过URL从网络上获取xml数据.下面介绍如何将获取到的数据进行解析. 下面先看看xml的数据格式吧! <?xml version="1.0" enc ...

  6. 一:详解 HTTP 协议

    本篇文章篇幅比较长,先来个思维导图预览一下. 一张图带你看完本篇文章 一.概述 1.计算机网络体系结构分层 计算机网络体系结构分层 2.TCP/IP 通信传输流 利用 TCP/IP 协议族进行网络通信 ...

  7. HTTP协议简介详解 HTTP协议发展 原理 请求方法 响应状态码 请求头 请求首部 java模拟浏览器客户端服务端

    协议简介 协议,自然语言里面就是契约,也是双方或者多方经过协商达成的一致意见; 契约也即类似于合同,自然有甲方123...,乙方123...,哪些能做,哪些不能做; 通信协议,也即是双方通过网络通信必 ...

  8. 详解HTTP协议

    一 什么是HTTP协议 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网服务器传输超文本到本地浏览器的传送协议.HTTP 是基于 TCP/ ...

  9. rtp协议详解/rtcp协议详解

    转自:http://www.cnblogs.com/li0803/archive/2010/11/20/1882792.html 1.简介 目前,在IP网络中实现实时语音.视频通信和应用已经成为网络应 ...

随机推荐

  1. Android全局异常捕捉

    // 定义自定义捕捉 package com.xiaosw.test; import java.io.File; import java.io.FileOutputStream; import jav ...

  2. oracle 11g centos6 安装

    选型:32位的内存是个瓶颈,已经是64位的时代了.使用64位的CentOS6 和 64位的Oracle 11g R2在虚拟机器安装,采用hostonly方式设置网络注意:能上网的网卡要设置一下ICS( ...

  3. MonkeyRunner之小白如何使用MonkeyRecorder录制回放脚本

    之前摸索了好久.学习Python语言.安装工具.拉拉溜溜也慢慢地一点点进步.每天就疯狂的上网找资料.虽然大牛们写的很详细.但是自己就是笨的不知怎么做.最后找了一篇文章,真的就是万事俱备只欠东风的感觉, ...

  4. Azure Messaging-ServiceBus Messaging消息队列技术系列6-消息回执

    上篇博文中我们介绍了Azure Messaging的重复消息机制.At most once 和At least once. Azure Messaging-ServiceBus Messaging消息 ...

  5. shell脚本监控目录下文件被篡改时报警

    思路: 目录下文件被篡改的几种可能: 1.被修改 2.被删除 3.新增文件 md5命令详解 参数: -b 以二进制模式读入文件内容 -t 以文本模式读入文件内容 -c 根据已生成的md5值,对现存文件 ...

  6. Java EE基础之JSP

    从本篇文章开始,我会用文章记录下我在学习Java EE过程中的一些笔记和感悟,至于还没有更新结束的Java SE还是会继续写的,只是我觉得一直写语法很枯燥,自己也没法继续下去,所以带着点web学习,会 ...

  7. 不使用回调函数的ajax请求实现(async和await简化回调函数嵌套)

    在常规的服务器端程序设计中, 比如说爬虫程序, 发送http请求的过程会使整个执行过程阻塞,直到http请求响应完成代码才会继续执行, 以php为例子 $url = "http://www. ...

  8. css中的inline-block

    div { display: inline-block; *display: inline; *zoom: 1; } Basic Support包含值:none | inline | block | ...

  9. git工具使用方法及常用命令

    git下载地址:https://git-for-windows.github.io/git环境变量配置:增加:GIT_HOME = C:\Git (文件夹为git软件的安装文件夹)Path添加: %G ...

  10. VC加载显示bmp图片的函数

    void ShowBitmap(HDC hdc,const char *srcpath) { HBITMAP hBitmap = (HBITMAP)::LoadImage(0, srcpath, IM ...