category和extension
2016-07-28 18:16
399 查看
Category
利用Objective-C的动态运行时分配机制,Category提供了一种比继承(inheritance)更为简洁的方法来对类进行扩展,无需创建对象类的子类就能为现有的类添加新方法,可以为任何已经存在的类添加方法,包括那些没有源代码的类.如系统框架类Foundation,UIKit等等。
特点:
在不修改原有的类的基础上增加新的方法,让这个类能够适应不同情况的需求一个庞大的类可以分模块开发,有利于团队协作
如果分类和原来类出现同名的方法, 优先调用分类中的方法,原来类中的方法会被忽略
在一般的实际开发中,我们都会对系统的一些常用类进行扩展,比如,NSString,Button,Label等
局限性:
分类只能增加方法,不能增加成员变量,不过可以通过运行时增加创建过程:
在这里我们创建Objective-C File选择Category,并且填写分类名
创建好的文件名是这样的
示例代码
// UIButton+Category.h #import <UIKit/UIKit.h> @interface UIButton (Category) - (void)test; @end ******************************* // UIButton+Category.m #import "UIButton+Category.h" @implementation UIButton (Category) - (void)test { NSLog(@"%@",self); } ******************************* //调用 #import "UIButton+Category.h" UIButton *button = [[UIButton alloc] init]; //调用分类方法 [button test];
Extension
特点:
extension中声明的方法需要在implementation中实现,而category 不做强制要求extension可以添加属性、成员变量,而category 一般不可以
类的延展可以看作是一种匿名的Category,类有时需要一些只为自己所见,所用的私有方法这种私有方法可以通过延展的方式来声明,延展中定义的方法在类本身的@implementation代码区域中进行实现。
和Category对比:
extension在编译器决议,是类的一部分,在编译器和头文件的@interface和实现文件里的@implement一起形成了一个完整的类。
伴随着类的产生而产生,也随着类的消失而消失。
extension一般用来隐藏类的私有消息,你必须有一个类的源码才能添加一个类的extension,所以对于系统一些类,如NSString,就无法添加类扩展
category
是运行期决议的
类扩展可以添加实例变量,分类不能添加实例变量
原因:因为在运行期,对象的内存布局已经确定,如果添加实例变量会破坏类的内部布局,这对编译性语言是灾难性的。
创建过程:
前面过程一样,在这里选择extension文件格式:
示例代码:
// UIButton_Extension.h #import <UIKit/UIKit.h> @interface UIButton () - (void)test; @end @implementation UIButton () - (void)test { NSLog(@"%@",self); } @end
http://www.jianshu.com/p/935e966c0c08
http://blog.sina.com.cn/s/blog_a2c098b50101gsn0.html
http://www.jianshu.com/p/b9bef4946aed
相关文章推荐
- php7 扩展类的写法[2]
- php7 类的方法传参[3]
- php7 读取php.ini[4]
- 杰奇分类设置方法
- C#、ASP.NET通用扩展工具类之TypeParse
- Lua编程示例(二):面向对象、metatable对表进行扩展
- Windows Powershell扩展类型系统
- C#、ASP.NET通用扩展工具类之LogicSugar
- SQL Server下几个危险的扩展存储过程
- jQuery 学习第七课 扩展jQuery的功能 插件开发
- 运行Node.js的IIS扩展iisnode安装配置笔记
- 基于MySql的扩展功能生成全局ID
- jquery通过扩展select控件实现支持enter或focus选择的方法
- nodejs实现获取某宝商品分类
- 一个扩展时间段的dir命令的vbs脚本
- Ruby中使用SWIG编写ruby扩展模块实例
- php通过分类列表产生分类树数组的方法
- PHP memcache扩展的三种安装方法
- 用C/C++扩展你的PHP 为你的php增加功能
- .NET 扩展实现代码