iOS categoryde用法以及extension的区别

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

一.category 

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

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

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

22160738_VAmD.png

注意:必须使用@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 一般不可以。

转载于:https://my.oschina.net/u/1244672/blog/618825

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iOS中,我们可以使用Action Extension来扩展应用程序的功能。Action Extension是一种允许用户在其他应用程序中执行特定操作的扩展,例如分享内容、保存信息等。 要创建Action Extension扩展,可以按照以下步骤进行操作: 1. 在Xcode中打开你的应用程序项目。 2. 在左侧导航栏中选择项目的名称,打开项目设置。 3. 在顶部菜单栏中选择"Target"。 4. 点击页面下方的"+"按钮,选择"Action Extension"作为新的目标。 5. 输入Extension的名称,例如"ShareExtension",然后点击"Finish"。 6. Xcode会自动生成一些默认的文件和设置,你可以根据需求进行修改。 7. 打开"Info.plist"文件,配置Action Extension的一些基本信息,例如名称、图标等。 8. 在Action Extension的代码文件中,你可以获取分享的内容,并进行相应的处理。 9. 你还可以在Action Extension中添加自定义的界面,使用户能够更方便地进行操作。 10. 编译并运行你的应用程序,可以选择其他应用程序中的内容,然后在分享菜单中找到你的Action Extension,执行相应的操作。 需要注意的是,为了使Action Extension正常工作,还需要在应用程序设置中配置一些权限和共享数据的支持。你可以在"Capabilities"选项卡中设置对应的权限和所需的共享数据类型。 创建完Action Extension后,你可以将其与应用程序打包在一起分发,用户可以通过在其他应用程序中选择分享菜单来使用你的Action Extension。 总的来说,创建iOS中的Action Extension扩展是一个相对简单的过程,通过使用Action Extension,你可以方便地为你的应用程序提供更多的功能和交互方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值