IOS开发-ObjC-Category的使用
在IOS移动App开发中,经常会出现以下情况:定义好了一个类,但后来需求升级或改变之后需要对这个类增加功能,这样的话往往需要修改类的结构,这样就会导致不能预期的问题产生,所以Obj-C提供了一种叫做Category的方法来对类进行扩展,在不改变原有类结构的基础上增加新的功能。具体的使用方法如下文。
假设我们现在有一个类叫做Person类,继承自NSobject,Person类目前有一个功能就是改变Person实体对象的年龄函数,叫做changeAge,具体的声明和实现如下:
1.类Person的声明:
// Person.h
#import <Foundation/Foundation.h> @interface Person : NSObject
-(void)changeAge;
@end
2.类Person的实现
// Person.m
#import "Person.h" @implementation Person
-(void)changeAge
{
Nslog(@"Person类的年龄改变了");
}
@end
一开始我们的规划中,Person类中只需要一个功能也就是changeAge,后来考虑到Person年龄会随着时间而改变(需求变化)导致我们需要增加一个功能,当年份增加的时候,Age也要对应加1,这样我们就需要增加一个ageAutoChange的方法,按照文章开头的说法,使用category可以在不改变原有类的基础上增加类的方法,具体做法如下:
1)点击新建文件,在弹出的对话框中选择Objective-C File,然后下一步,在弹出的对话框中会有三个输入框,第一个是File:这个后面填你要增加的方法的文件名,我这里填入autoage,第二个是File Type:这个里面下拉选择Category,然后第三个Class,也就是要扩展的类名,我这里下拉选择Person,然后点击Next保存,就完成了扩展类的新建;
2)完成第一步之后会多出两个文件,分别是Person+Person_Autoage.h和Person+Person_Autoage.m,然后在Person+Person_Autoage.h中编辑如下:
// Person+Person_autoAge.h #import "Person.h" @interface Person (Person_autoAge)
-(void)autoChangeAge;
@end
在Person+Person_Autoage.m中编辑如下:
// Person+Person_autoAge.m #import "Person+Person_autoAge.h" @implementation Person (Person_autoAge)
-(void)autoChangeAge
{
NSLog(@"Person的年龄增加1岁了");
}
@end
这样就完成了新功能的增加(在不该变原来类的定义的基础上)
接下来我们要在主函数里调用这两个方法,以验证我们的理解是否有偏差:
// main.m #import <Foundation/Foundation.h>
#import "Person.h"
#import "Person+Person_autoAge.h" int main(int argc, const char * argv[]) {
{
Person * p1=[[Person alloc] init];
[p1 changeAge];
[p1 autoChangeAge];
}
return ;
}
完成之后点击运行,命令行中出现如下:
-- ::23.310 studyCategory[:] Person类的年龄改变了
-- ::23.330 studyCategory[:] Person的年龄增加1岁了
Program ended with exit code:
这就说明我们的过程是没有问题的,Person的对象p1不但可以正常调用changeAge这个方法,也可以定义我们后来增加的autoChangeAge的功能。
通过Category这个功能把类的方法切分在了不同的文件中,具体有什么好处,我在以后的学习过程中体验到了会补充出来的,毕竟现在只是学习过程,先把功能学会。
IOS开发-ObjC-Category的使用的更多相关文章
- iOS开发系列-Category
Category Category是OC中特有的语法.Category的作用 * 可以在不修改原来类的基础上,为这个类扩充一些方法 * 一个庞大的类可以分为多个模块开发 * 一个庞大的类可以由多个人来 ...
- iOS开发系列--Swift进阶
概述 上一篇文章<iOS开发系列--Swift语言>中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用S ...
- IOS开发基础知识碎片-导航
1:IOS开发基础知识--碎片1 a:NSString与NSInteger的互换 b:Objective-c中集合里面不能存放基础类型,比如int string float等,只能把它们转化成对象才可 ...
- IOS开发基础知识--碎片47
1:解决ios静态库中的类别(category)在工程中不能使用 解决方法为:找到 target 的图标,更改其 Other Linker Flags 为: -all_load 或 -force_lo ...
- iOS开发路线简述
1 iOS开发环境1.1 开发环境标准的配置是MacOSX+Xcode.MacOSX的话首选用苹果电脑,Macmini最便宜只要4000多就好了然后自己配一个显示器,MacBookPro 也可以,不推 ...
- ios 开发中 动态库 与静态库的区别
使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库, ...
- iOS开发app启动原理及视图和控制器的函数调用顺序
main()函数是整个程序的入口,在程序启动之前,系统会调用exec()函数.在Unix中exec和system的不同在于,system是用shell来调用程序,相当于fork+exec+waitpi ...
- iOS开发中 workspace 与 static lib 工程的联合使用
在iOS开发中,其实workspace的使用没有完全发挥出来,最近做了一些研究,也想把之前写过的代码整理下,因为iOS里面的布局方式,交互方式也就那么几种.所以,整理好了之后,更能快捷开发,而且能够形 ...
- iOS开发拓展篇—静态库
iOS开发拓展篇—静态库 一.简单介绍 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的分类 根据源代码的公开情况,库可以分为2种类型 (1)开源库 公开源代码,能看到具体实现 ...
- iOS开发之静态库(一)—— 基本概念
在项目开发过程中,经常出现优秀代码重用现象,又或者提供给第三方功能模块却又不想让其看到源代码,这些时候,通常的做法是将代码封装成库或者框架,这些在Windows编程或Linux编程中非常容易实现的过程 ...
随机推荐
- Git学习 -- 工作区和暂存区
工作区(working directory): 就是能看到的目录,如我的git文件夹 版本库(repository): 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库 里面最重要的就 ...
- 利用Hierarchy Viewer优化布局
好久没更新博客了,趁着清明来写点什么. 今天来讲下如何使用android中提供的工具优化我们的布局.首先我们写一个最简单的框架布局. <?xml version="1.0" ...
- 吾爱破解脱壳练习第五期------upx壳
内存镜像法: 载入OD:
- 善用log日志
#-*- coding:utf-8 -*- import logging logger = logging.getLogger() #定义一个log日志对象 hdlr = logging.FileHa ...
- Vsftp配置都没有问题 连接不上 530 Login incorrect 解决方法
客户端输入正确的用户名和密码之后,却一直显示:530 Login incorrectLogin Failed后来发现在etc下面有个pam.d文件夹进去打开vsftpd这个文件, 发现里面对之前的用户 ...
- centos6.5下Zabbix系列之Zabbix安装搭建及汉化 (转)
最近在研究zabbix,在整理完成之后就有了写一下总结博客的想法,在我研究zabbix的时候给我很大帮助的是it你好,博客地址 http://itnihao.blog.51cto.com/他做的zab ...
- 转 Fragment 和 FragmentActivity的使用
今天学习下 Android中的 Fragment 和 FragmentActivity,因为没有4.0手机,平台是2.3.3 所以我是使用 v4 support 包来进行学习. 要想用Fragment ...
- 转 Android 编程下两种方式注册广播的区别
常驻型广播 常驻型广播,当你的应用程序关闭了,如果有广播信息来,你写的广播接收器同样的能接收到,它的注册方式就是在你应用程序的AndroidManifast.xml 中进行注册,这种注册方式通常又被称 ...
- I2C死锁原因及解决方法(转)
源:http://blog.csdn.net/zyboy2000/article/details/5603091 死锁总线表现为:SCL为高,SDA一直为低 现象:单片机采用硬件i2c读取E2PROM ...
- 字符串解析运用-将字符串分解为多个整数,求各整数之和(华为oj)
描述 输入内容是一个字符串,输出结果为一个字符串.要求在输入的字符串中识别出多个整数单元,并且对各个整数单元求和运算,最终输出一个字符串,输出的字符串内容是对各个整数单元求和的结果.两个整数单元之间以 ...