文档章节

iOS categoryde用法以及extension的区别

S
 Snaiper
发布于 2016/02/22 16:07
字数 871
阅读 33
收藏 0

OS中category即:类别 ;extension 为扩张

一.category 

类别是一种为现有的类添加新方法的方式。

利用Objective-C的动态运行时分配机制,Category提供了一种比继承(inheritance)更为简洁的方法来对class进行扩展,无需创建对象类的子类就能为现有的类添加新方法,可以为任何已经存在的class添加方法,包括那些没有源代码的类(如某些框架类)。

1.类别的局限:(1)无法向类别中添加新的实例变量,类别没有位置容纳实例变量。如果一定要添加实例变量,可以采用runtime 库objc_setAssociatedObject / objc_getAssociatedObject 函数来解决。objc_setAssociatedObject 就是将一个对象跟另一个对象进行关联,并用一个key来标示,objc_getAssociatedObject 就是用这个key来拿到与receiver相关联的一个对象。


注意:必须使用@dynamic来让编译器知道我们自己实现setter/getter方法(如果对于@dynamic有疑问,请参见:http://stackoverflow.com/questions/1160498/synthesize-vs-dynamic-what-are-the-differences)

         不能使用@synthesize(也不能@dynamic 和@synthesize都不写,什么都不写在最新的xcode里是默认@synthesize),@synthesize会自动生成成员变量,并自动生成setter/getter方法。

         最后,objc_setAssociatedObject 的关联的policy 可以根据自己的需求使用,这个例子使用 OBJC_ASSOCIATION_RETAIN_NONATOMIC来标示一个strong reference来指向被关联的对象。

(2)名称冲突,即当类别中的方法名与原始类中的名称相同的时候,类别具有更高的优先级。类别的方法将完全取代原始方法而无法再使用原始方法。


这段话的说法是不严谨的,类别并不是有更高的优先级,在运行时,类与类别的运行循序有关系。
假如类别和类都有同一个方法 methodA,那么在 runtime 期要先把类中的 method 放入方法栈里,然后再放类别中 method A,这样是在方法栈中放了两个 methodA。
在调用 methodA 时,会遍历这个类的方法栈,只要发现 methodA 就会停止遍历,所以自然屌用的就是类别中的 methodA 了。

2.类别的作用

类别的作用主要有三个:

(1)可以将类的实现分散到多个不同的文件或者不同的框架中,方便代码的管理。也可以对框架提供类的扩展(没有源码,不能修改)。

 (2)创建对私有方法的前向引用:如果其他类中的方法未实现,在你访问其他类的私有方法时编译器报错这时使用类别,在类别中声明这些方法(不必提供方法实现),编译器就不会再产生警告

 (3)向对象添加非正式协议:创建一个NSObject的类别称为“创建一个非正式协议”,因为可以作为任何类的委托对象使用。

二.Extension 的使用

   首先还是需要创建相关类的扩展,即方法的声明,然后在需要扩张的类中引入头文件,然后实现声明的方法。

三.Category 与Extension 的区别

1.形式上看:extension 是匿名的category

2.extension中声明的方法需要在mainimplementation中实现,而category 不做强制要求

3.extension 可以添加属性、成员变量,而category 一般不可以。

© 著作权归作者所有

S
粉丝 13
博文 100
码字总数 135194
作品 0
深圳
私信 提问
2018 iOS 面试题大全(补充完整版)

原文地址:2018 iOS 面试题大全 由于原作者并没有继续更新,这里我转过来继续更新下 这个栏目将持续更新--请iOS的小伙伴关注! 1、iOS 应用导航模式有哪些? 2、iOS 中持久化方式有哪些? 3、...

Theendisthebegi
2018/11/15
0
0
为什么提交AppStore时提示support arm64错误(Invalid architecture: Apps that include an app extension and framework must support arm64.)?

我的ios程序在提交AppStore时报以下两个错误: ERROR ITMS-90086: "Missing 64-bit support. iOS apps submitted to the App Store must include 64-bit support and be built with the iOS......

小聪提醒
2016/12/04
320
0
10个优秀Objective-C和iOS开发在线视频教程

如果你自己开发iOS应用,你肯定会发现网上有很多资源。学习编程的一个最好的方法就是自己写代码,而开始写代码的最快的方式就是看其他人怎么写。我们从海量视频和学习网站中整理出了我们认为...

mingxun
2014/05/09
0
0
使用 Xamarin 开发 iOS 键盘扩展(含网络访问)

版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/...

walter lv
02/24
0
0
xcode5-ios7-如何添加120×120图标(ios7图标命名)

Xcode5发布需要的新的程序图标 Icon.png 57X57 10px 用户AppStore以及iPhone/iPod 中显示 必需 Icon@2x.png 114X114 20px 高清模式 Icon120.png 120X120 20px 用于iPhone5的高清显示 Icon-S...

lingfeng72
2015/06/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

聊聊Elasticsearch的CircuitBreakerService

序 本文主要研究一下Elasticsearch的CircuitBreakerService CircuitBreakerService elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/indices/breaker/CircuitBreakerService.ja......

go4it
32分钟前
3
0
Spring系列教程六:AOP详细讲解

AOP 概述 什么是 AOP AOP:全称是 Aspect Oriented Programming 即:面向切面编程。 AOP技术是对OOP技术的一种延伸,AOP是面向纵向,OOP是面向横向。简单的说它就是把我们程序重复的代码抽取...

我叫小糖主
45分钟前
12
0
Qt编写数据可视化大屏界面电子看板9-曲线效果

一、前言 为了编写数据可视化大屏界面电子看板系统,为了能够兼容Qt4和嵌入式linux系统,尤其是那种主频很低的,但是老板又需要在这种硬件上(比如树莓派、香橙派、全志H3、imx6)展示这么华...

飞扬青云
今天
3
0
责任链模式

//这篇博客的博主真的不错,解析的都很清晰明了, https://blog.csdn.net/jason0539/article/details/45091639

南桥北木
今天
3
0
Flutter -------- dio网络请求

dio是Flutter中文网开源的一个强大的Dart Http请求库,支持Restful API、FormData、拦截器、请求取消、Cookie管理、文件上传/下载、超时等... 1.添加依赖# dependencies: dio: 2.1.x #...

切切歆语
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部