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编程中非常容易实现的过程 ...
随机推荐
- My workbench draft
System Linux / Ubuntu 14.04.5 LTS (Trusty Tahr) + ROS Indigo Linux / Ubuntu 16.04.1 LTS (Xenial Xeru ...
- 忘了SA密码的SQL SERVER
[暂时还未验证] SQL2008 如果 本地连接登录补上,也忘了Sa等管理账号的密码,可以通过单用户连接的方式登录 http://msdn.microsoft.com/zh-cn/library/m ...
- nginx slab内存管理
本来这一篇作为nginx系列的开头是不合适的,不过由于nginx进程框架自己的梳理还没完成,这部分又刚好整理完了,就从这开始吧.这儿谈的是nginx的slab的内存管理方式,这种方式的内存管理在ngi ...
- 【啊哈!算法】算法6:只有五行的Floyd最短路算法
暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,如下图.为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程. 上图中有 ...
- android使用百度app分享,app统计出现的异常,FrontiaApplication类
想在app里加入百度分享和百度统计.查看了百度移动统计的文档后下载官网给的demo.参照demo给出的代码给自己的app加入代码.以上步骤比较简单.不细说,下面说下此过程需要注意的一些点,不然会引发异 ...
- copy_part_stat.sql
spool 04_copy_part_stat.log conn / as sysdba execute sys.dbms_stats.export_schema_stats(ownname=> ...
- 【栈】 poj 1363
poj1363,这道题是数据结构与算法中的经典问题,给定一组进栈顺序,问栈有多少种出去的顺序. #include<stdio.h> #include <stack> #incl ...
- Ubuntu系统如何卸载并安装新版本的jdk(permission denied问题)
1.如果是自带的openjdk运行下面可以删除: sudo apt-get purge openjdk* 但是这种情况又不一定成功,有时候运行java -version发现还是可以运行的.证明删除不成 ...
- Android开发之InstanceState详解(转)---利用其保存Activity状态
Android开发之InstanceState详解 本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...
- C# 的sql server like 的参数
//试了多种方式,这样写like的参数才正确 sb.Append(" and a.GOODSID like '%'+@GOODSID+'%'"); list.Add(new Sql ...