iOS·NSObject的两种含义:类与协议

1. 区分:类的NSObject与协议的NSObject

iOS开发中,苹果提供的一些系统类都属于NSObject的子类,例如UIColor类的定义如下所示。

UIColor

或者自定义的类,也继承自NSObject,例如下图所示。

自定义类的父类

但是,NSObject不仅仅代表基类,还有协议的意思,我们可以称之根协议,例如下图所示:

NSObject协议

事实上,从NSObject类的定义可知,NSObject的类本身就遵循NSObject协议,如下图所示。

NSObject

2. 协议NSObject的用法

  • NSObject协议的定义

image.png

  • 普通协议的用法
@protocol MyProtocol
- (void)foo; 
@end
  • 继承根协议的用法
@protocol MyProtocol<NSObject> 
- (void)foo; 
@end
  • 多继承的用法

假设你自定义一个继承自UITextField的子类MyTextFeild,同时自定义一个代理MyTextFeildDelegate的属性如下:

@protocol MyTextFieldDelegate <NSObject>
//...

@property (nonatomic, weak) id <MyTextFeildDelegate> delegate;

这时候会报错的,因为这个delegate与父类的delegate的协议冲突。一个解决办法是利用协议的多继承:将自定义的协议继承自父类中的协议。

@protocol MyTextFieldDelegate <NSObject,UITextFieldDelegate>

//...
@property (nonatomic, weak) id <MyTextFeildDelegate> delegate;

3. 拓展

OC里面的类本来是不支持多继承的,但有的面试官还是会问到iOS里面如何实现多继承?除了运行时的办法,还有一种就是通过协议的多继承来实现。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一“技”之长

iOS剪切板UIPasteboard开发应用解析

   在iOS的UI系统中,有3个控件自带剪切板操作,分别是UITextField、UITextView与UIWebView。在这些控件的文字交互处进行长按手势...

22220
来自专栏冰霜之地

iOS如何优雅的处理“回调地狱Callback hell”(一)——使用PromiseKit

最近看了一些Swift关于封装异步操作过程的文章,比如RxSwift,RAC等等,因为回调地狱我自己也写过,很有感触,于是就翻出了Promise来研究学习一下。...

53230
来自专栏编程之旅

iOS开发——自主设计日志系统

好像很久没有写有关iOS的文章了,其实iOS的开发一直都是在进行的,但是最近有需求拓宽知识的宽度,所以一直在接触别的知识,当然啦,移动端开发并不能丢下。

16720
来自专栏進无尽的文章

RunTime 之其他实践运用

有关Runtime的知识总结,我本来想集中写成一篇文章的,但是最后发现实在是太长,而且不利于阅读,最后分成了如下几篇:

11730
来自专栏陈满iOS

iOS·数据结构选型:在某数据结构中避免重复字符串元素(NSArray,NSSet,NSDictionary)

解析某博客或者书籍网站数据时:已知它的书籍首页URL地址,这个首页含有它的书籍目录及其章节的链接,APP想拉取它的目录节点,然而,该目录页面里面的章节可能有重复...

13120
来自专栏xx_Cc的学习总结专栏

iOS-单例模式写一次就够了

24650
来自专栏岑志军的专栏

KVO详解及底层实现

16420
来自专栏王大锤

swift3.0之后的Error处理

24150
来自专栏流媒体人生

ATL Thunk机制学习

  ATL模板类库使用Thunk技术来实现与窗口消息相关联的HWND和负责处理消息的对象的this指针之间的映射。      ATL中窗口类注册时,窗口过程函数...

6810
来自专栏程序生活

Python pickle的使用pickle简介实例参考资料

pickle模块是对Python对象结构进行二进制序列化和反序列化的协议实现,就是把Python数据变成流的形式。

8710

扫码关注云+社区

领取腾讯云代金券