iOS -类目,延展,协议
1.类目
类目就是为已存在的类添加新的方法。但是不能添加实例变量。比如系统的类,我们看不到他的.m文件,所以没有办法用直接添加方法的方式去实现。
@interface NSMutableArray (Sort) //为NSMutableArray类添加Sort方法,Sort就是类目名,做到见名知意
-(void)invert;//方法
@end
实现部分
#import "NSMutableArray+Sort.h"
@implementation NSMutableArray (Sort)
-(void)invert
{
NSUInteger count = self.count;
for (int i = 0; i<count/2; i++)
{
[self exchangeObjectAtIndex:i withObjectAtIndex:count-i-1];//第一个对象和最后一个对象交换
}
}
@end
在主函数里边可以直接调用上边的invert方法
NSMutableArray * arr = [[NSMutableArray alloc]initWithObjects:@"12",@"4",@"89",@"88",@"36", nil];
[arr invert];
NSLog(@"%@",arr);
打印结果:
2012-08-13 11:12:03.324 类目[980:14503] (
36,
88,
89,
4,
12
)
Category的使用场景有那些呢:
1、类包含了很多个方法实现,而这些方法需要不同团队的成员来实现
2、当你在使用基础类库中的类时,你不想继承这些类而只想添加一些方法时。
Category能实现上面的需求,当然也有使用Category是需要注意的问题:
1、Category可以访问原始类的实例变量,但不能添加实例变量,如果想添加变量,那就通过继承创建子类来实现。
2、Category可以重载原始类的方法,不大不推荐这么做,这样会覆盖掉原始类的方法。如果确实要重载,那就通过继承创建子类来实现。
3、和普通接口有所区别的是,在Category的实现文件中的实例方法只要你不去调用它你可以不用实现所有声明的所有方法。
2.延展
延展的作用就是定义自己的私有方法。
形式和类目相同,不用新创建文件,只是把类目的interface地方的文件放在了你需要扩展的类的.m文件里边。
#import "Student.h"
@interface Student (extension)//为Student类创建一个私有的方法text
-(void)text;
@end
@implementation Student
-(void)hello;
{
[self text];
}
-(void)text
{
NSLog(@"你好");
}
@end
外界 [student hello]的时候就会打印出“你好”。但是在外界不能调用text方法,[student text]是不对的。只能在.m文件里边通过self来调用私有方法text。隐藏了内部的实现。
3.协议
(1).协议声明了可以被其他的类实现的方法。协议本身必不会去实现。
(2).协议不是类,只是一个其他对象可以实现的接口。
定义一个协议:
#import <Foundation/Foundation.h>
@protocol MarryProtocol <NSObject>//定义一个结婚协议,结婚协议也可以继承其它的协议。
@required //必须遵守的协议,在遵守MarryProtocol协议的类的.m文件中去实现里边的方法。
- (void)washClothes;
- (void)cook;
@optional //可选的协议
- (void)makeMoney;
@end
代理(委托)模式:自己有需求,但是让别人去做。
定义一个Men类
#import <Foundation/Foundation.h>
#import "RoomService.h"
@interface Men : NSObject
@property(nonatomic,retain)NSString * name;
@property(nonatomic,assign)id<MarryProtocol> mate;//定义一个代理
-(id)initWithName:(NSString *)name;
-(void)needEat;
@end
定义一个Women类
#import <Foundation/Foundation.h>
#import "MarryProtocol"
@interfaceWomen : NSObject <MarryProtocol> //遵守协议
@property(nonatomic,retain)NSString * name;
-(id)initWithName:(NSString *)name;
@end
在Men的实现里边
-(void)needEat
{
[self.mate cook];
}
在Women的实现里边有一个方法
-(void)cook
{
NSLog(%@"wonmen正在做饭");
}
主函数里边
men.mate = women;
[men needEat];
打印出:wonmen正在做饭
4.协议也可以写在一个类里边,用到的时候引入类的头文件就可以。
iOS -类目,延展,协议的更多相关文章
- iOS类目、延展和协议
类目:为已知的类增加新的方法:注意:类目里面只能写方法,不能写声明和属性,所以,类目不能作为接口来用 1.类目无法向已有类中添加实例变量.2.如果类目中的方法和已有类中的方法名称冲突时,类目中的方法优 ...
- Objective-C学习笔记类目、协议
不是所有的方法都可以被覆盖的!比如:intValue就不能被覆盖!! 原因正在查找中! 别人的电脑上却可以! 类目.h件 #import <Foundation/Foundation.h> ...
- iOS类目
首先我们解释一下类目是什么 iOS中类目是为给已经存在的类加入新的方法.(可是不能加入实例变量) 也就是说 我们已经有一个类了 .可是我们发现这个类眼下所提供的方法,满足不了我们的需求,我们须要新的方 ...
- objective-c 类目(Category)和延展(Extension)
类目的基本概念: 如果有封装好的一个类,随着程序功能的增加,需要在类中增加一个方法,那我们就不必在那个类中做修改或者再定义一个子类,只需要在用到那个方法时添加一个该类的类目即可. 1.在类目定义的方法 ...
- Objective-C中的类目,延展,协议
Objective-C中的类目(Category),延展(Extension),协议(Protocol)这些名词看起来挺牛的,瞬间感觉OC好高大上.在其他OOP语言中就没见过这些名词,刚看到这三个名词 ...
- OC中协议, 类目, 时间, 延展, 属性
只有继承和协议需要引IMPORT "头文件"; 必须接受marryprotocol协议, id<marryprotocol>基于类型的限定, 才能给实例变量赋值 @pr ...
- OC 中 类目、延展和协议
Category : 也叫分类,类目. *是 为没有源代码的类 扩充功能 *扩充的功能会成为原有类的一部分,可以通过原有类或者原有类的对象直接调用,并且可继承 *该方法只能扩充方法,不能扩充实例变量 ...
- object-c中的类目,延展,协议
协议 协议只有方法的声明(类似于其他编程语言的接口) 协议相当于大家都所遵循的 关键字 @protocol 协议名 <所遵循的协议> 默认NSObject @end @pr ...
- 寒假 OC-代理,类目,内存,协议,延展,数组,字典,集合
OC04字符串博客:1.http://www.cnblogs.com/heyonggang/p/3452556.html (字符串常用方法)2.http://blog.sina.com.cn/s/b ...
随机推荐
- JLS(Third Edition) Chapter12 Execution
这一章详细说明在一个program执行时,发生的activities. 它根据JVM和组成program的类.接口.实例的生命周期 组织. 一个JVM从加载一个特定的类并调用它的main方法开始启 ...
- 【C语言入门教程】3.3 条件控制语句
在程序的 3 种基本结构中,第二种是选择结构,选择结构是根据程序运行时获得的条件,决定程序执行情况.条件控制语句可用来实现这种结构,C 语言提供了 if 语句和 switch 语句两种条件控制语句,i ...
- Android中使用SQLiteOpenHelper管理SD卡中的数据库
使用Android中自带的SQLiteOpenHelper可以完成数据库的创建与管理,但有两点局限: (1)数据库创建在内存卡中,大小受限,创建位置位于/data/data/应用程序名/databas ...
- BZOJ1146——[CTSC2008]网络管理Network
1.题目大意:就是在动态的树上路径权值第k大. 2.分析:这个就是树链剖分+树套树 #include <cstdio> #include <cstdlib> #include ...
- HTML5 localStorage 的使用
在前端开发中,我们会常遇到要在两个甚至多个html之间通信,我们可以在url中添加参数,但是当要传递的数据量较大较多时呢,不妨试试html5 的localStorage吧. 1) 检测你的浏览器是 ...
- [codevs1380]没有上司的舞会([BZOJ2060][Usaco2010 Nov]Visiting Cows 拜访奶牛)
[codevs1380]没有上司的舞会 试题描述 Ural大学有N个职员,编号为1~N.他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.每个职员有一个快乐指数.现 ...
- Android学习之路书籍推荐
Android开发书籍推荐:从入门到精通系列学习路线书籍介绍 JAVA入门书籍: < Introduction to java programming > < Core java & ...
- BZOJ 1718: [Usaco2006 Jan] Redundant Paths 分离的路径
Description 给出一个无向图,求将他构造成双连通图所需加的最少边数. Sol Tarjan求割边+缩点. 求出割边,然后缩点. 将双连通分量缩成一个点,然后重建图,建出来的就是一棵树,因为每 ...
- gcc编译时对'xxxx'未定义的引用问题
gcc编译时对’xxxx’未定义的引用问题 gcc编译时对’xxxx’未定义的引用问题 原因 解决办法 gcc 依赖顺序问题 在使用gcc编译的时候有时候会碰到这样的问题,编译为.o(obj) 文件没 ...
- Appium+Robotframework实现Android应用的自动化测试-4:AppiumLibrary介绍和安装
Appium是个好东东,Android,iOS都支持,并且居然RobotFramework也支持Appium了,这就是本文要介绍的AppiumLibrary. 通过前面的文章大家知道可以使用多种语言来 ...