【objective-c】类目 延展 协议
2015-07-17 20:20
531 查看
1.类目
类目就是为已存在的类添加新的方法。但是不能添加实例变量。比如系统的类,我们看不到他的.m文件,所以没有办法用直接添加方法的方式去实现。
Category的使用场景有那些呢:
1、类包含了很多个方法实现,而这些方法需要不同团队的成员来实现
2、当你在使用基础类库中的类时,你不想继承这些类而只想添加一些方法时。
Category能实现上面的需求,当然也有使用Category是需要注意的问题:
1、Category可以访问原始类的实例变量,但不能添加实例变量,如果想添加变量,那就通过继承创建子类来实现。
2、Category可以重载原始类的方法,不大不推荐这么做,这样会覆盖掉原始类的方法。如果确实要重载,那就通过继承创建子类来实现。
3、和普通接口有所区别的是,在Category的实现文件中的实例方法只要你不去调用它你可以不用实现所有声明的所有方法。
4、Category可以添加属性,但是属性使用过于复杂。
2.延展
延展的作用就是定义自己的私有方法。
形式和类目相同,不用新创建文件,只是把类目的interface地方的文件放在了你需要扩展的类的.m文件里边。
外界 [student hello]的时候就会打印出“你好”。但是在外界不能调用text方法,[student text]是不对的。只能在.m文件里边通过self来调用私有方法text。隐藏了内部的实现。
3.协议
(1).协议声明了可以被其他的类实现的方法。协议本身必不会去实现。
(2).协议不是类,只是一个其他对象可以实现的接口。
定义一个协议:
代理(委托)模式:自己有需求,但是让别人去做。
定义一个Men类
定义一个Women类
在Men的实现里边
在Women的实现里边有一个方法
主函数里边
打印出:wonmen正在做饭
4.协议也可以写在一个类里边,用到的时候引入类的头文件就可以。
类目就是为已存在的类添加新的方法。但是不能添加实例变量。比如系统的类,我们看不到他的.m文件,所以没有办法用直接添加方法的方式去实现。
Category的使用场景有那些呢:
1、类包含了很多个方法实现,而这些方法需要不同团队的成员来实现
2、当你在使用基础类库中的类时,你不想继承这些类而只想添加一些方法时。
Category能实现上面的需求,当然也有使用Category是需要注意的问题:
1、Category可以访问原始类的实例变量,但不能添加实例变量,如果想添加变量,那就通过继承创建子类来实现。
2、Category可以重载原始类的方法,不大不推荐这么做,这样会覆盖掉原始类的方法。如果确实要重载,那就通过继承创建子类来实现。
3、和普通接口有所区别的是,在Category的实现文件中的实例方法只要你不去调用它你可以不用实现所有声明的所有方法。
4、Category可以添加属性,但是属性使用过于复杂。
2.延展
延展的作用就是定义自己的私有方法。
形式和类目相同,不用新创建文件,只是把类目的interface地方的文件放在了你需要扩展的类的.m文件里边。
外界 [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.协议也可以写在一个类里边,用到的时候引入类的头文件就可以。
相关文章推荐
- Objective-C入门篇
- 【objective-c】内存管理原则
- objectOutputStream
- ObjectOutputStream
- 在一个项目中同时使用Swift和Objective-C代码混合编程的方法
- JsonObject 处理日期
- 一个对象toString()方法如果没有被重写,那么默认调用它的父类Object的toString()方法,而Object的toString()方法是打印该对象的hashCode,一般hashCode就是此对象的内存地址
- 关于Object-C 底层实现self isa 的理解
- iOS中id与NSObject* 和id<NSObject>的区别
- 问题-Error creating object. Please verify that the Microsoft Data Access Components 2.1(or later) have been properly installed.
- 问题-[ACCESS2007]怎么显示MsysObjects
- iOS指纹识别Object-C语言
- doppia object_detection代码配置
- 教程-delphi的开源json库:superobject,用法简介
- 【iOS】Objective-C简约而不简单的单例模式
- Object-C中使用NSKeyedArchiver归档(将各种类型的对象存储到文件中)
- 在servlet中使用json-lib报错--java.lang.NoClassDefFoundError: net/sf/json/JSONObject
- (转)C#4.0的dynamic和var及object关键字辨析
- Objective-C method XXX conflicts with optional requirement method XXX
- Objective-C中的NSValue的详解