iOS类目、延展和协议
类目:为已知的类增加新的方法;注意:类目里面只能写方法,不能写声明和属性,所以,类目不能作为接口来用
1、类目无法向已有类中添加实例变量。
2、如果类目中的方法和已有类中的方法名称冲突时,类目中的方法优先级高,如果方法名冲突,已有类中的原始方法便无法使用。
3、在使用类目的时候,最好是将自己扩展的方法和原始方法区分开来。
1、类目方法的应用:
1)对现有类进行扩展:如:可以扩展Cocoatouch框架中的类,在类目中增加的方法会被子类继承,而且在运行时跟其他的方法没有区别。
2)作为子类的替代手段:不需要定义和使用一个子类,可以通过类目直接向已有的类里增加方法。
3)对类中的方法归类:利用catigory把一个庞大的类划分为小块来分别进行开发,从而更好地对类中的方法进行更新和维护。
2、类目方法的局限性:
1)无法向类目中添加
新的实例变量,类目没有位置来容纳实例变量。如果想增加类的实例变量,只能通过定义子类的方式。
2)如若,在类目中覆盖先后类的方法。这样会引起super消息的断裂,因为类目总的方法具有更高的优先级,因此,一般不要覆盖现有类中的方法。
3、类目的定义:
类目的命名规则:类名+扩展方法,如“NSString+Revert”。类目的接口声明与类的定义十分相似,但类目不继承父类,只需要带有一个括号,表明该类目的主要用途。
4、举例说明:
NSString+Revert.h文件:
NSString+Revert.m文件:
延展:通知在本类的定义里使用类目来声明私有方法;
(1).延展的作用就是定义自己的私有方法。
(2).在自己类的实现文件中添加类目(匿名类目)来声明私有方法。(只有本类的.m文件中才能使用)。
(3).形式和类目相同,不用新创建文件,只是把类目的interface地方的文件放在了你需要扩展的类的.m文件里边。
类的延展可看成是一种匿名的类目,类有时需要一些只有自己看得见的,所用的私有方法可以通过延展的方式来声明,延展中定义的方法在类本身的@implementation代码区域中进行实现。
当在定义延展的时候不提供类目名时,延展中定义的方法既被视为“必须实现”的API在这种情况下,如果方法没有实现代码,那么编译器会报警告,这个时候方法的实现就一定要出现在类主体的@implementation代码块中了。
协议
(1).协议声明了可以被其他的类实现的方法。协议本身必不会去实现。
(2).协议不是类,只是一个其他对象可以实现的接口。
注意:
@required 必须方法 (默认)
@optional 可选方法
Girl.h文件中
#import <Foundation/Foundation.h>
#warning ▧▧▧▧▧▧▧▧▧▧ 1.声明协议 ▧▧▧▧▧▧▧▧▧▧
@protocol MarriageDelegate <NSObject>
@required //必须方法(默认)
- (void)makeMoney;
- (void)satisfyHer;
@optional //可选方法
- (void)cooking;
@end
@interface Girl : NSObject
#warning ▧▧▧▧▧▧▧▧▧▧ 2.设置代理人属性 ▧▧▧▧▧▧▧▧▧▧
@property (nonatomic, assign) id<Marriage> delegate;
- (void)buybuybuy;
@end
Girl.m文件中
#import "Girl.h"
@implementation Girl
- (void)buybuybuy{
#warning ▧▧▧▧▧▧▧▧▧▧ 3.代理人执行方法 ▧▧▧▧▧▧▧▧▧▧
[self.delegate makeMoney];
}
@end
Boy.h文件中
#import <Foundation/Foundation.h>
#import "Girl.h"
#warning ▧▧▧▧▧▧▧▧▧▧ 4.签订协议 (当前类中要实现必须方法) ▧▧▧▧▧▧▧▧▧▧
@interface Boy : NSObject <MarriageDelegate>
@end
Boy.m文件中
#import "Boy.h"
@implementation Boy
#warning ▧▧▧▧▧▧▧▧▧▧ 6.实现协议中声明的必须方法 ▧▧▧▧▧▧▧▧▧▧
- (void)makeMoney{
NSLog(@"赚钱");
}
- (void)satisfyHer{
NSLog(@"亲吻");
}
@end
协议演示
//////////协议演示//////////
#import <Foundation/Foundation.h>
#import "Girl.h"
#import "Boy.h"
int main(int argc, const char * argv[]) {
//////////使用代理//////////
Girl *girl = [[Girl alloc] init];
Boy *boy = [[Boy alloc] init];
#warning ▧▧▧▧▧▧▧▧▧▧ 5.指定代理人 ▧▧▧▧▧▧▧▧▧▧
girl.delegate = boy;
[girl buybuybuy];
//输出: 赚钱
//判断是否对象是否遵循某些协议
BOOL result = [girl conformsToProtocol:@protocol(Marriage)];
if (result) {
NSLog(@"遵循Marriage协议");
}else{
NSLog(@"不遵循Marriage协议");
}
//输出: 不遵循Marriage协议
return 0;
}
本文整理了简书Luisx的文章和51CTO蓝鸥张浩的博客,然后自己整理的,希望大家对类目、延展和协议有个新的认识。
iOS类目、延展和协议的更多相关文章
- iOS -类目,延展,协议
1.类目 类目就是为已存在的类添加新的方法.但是不能添加实例变量.比如系统的类,我们看不到他的.m文件,所以没有办法用直接添加方法的方式去实现. @interface NSMutableArray ( ...
- OC: 类的扩展、类的延展、协议、 NSDate
NSDateFormatter 指定⽇日期格式: NSDateFormatter * formatter = [[NSDateFormatter alloc] init]; [formatter ...
- 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 ...
随机推荐
- 深入剖析JDK动态代理源码实现
动态代理.静态代理优缺点优点:业务类只需要关注业务逻辑本身,保证了业务类的重用性.这是代理的共有优点.动态代理只有在用到被代理对象的时候才会对被代理类进行类加载. 而静态代理在编译器就已经开始占内存了 ...
- java 项目中每个jar包的作用总结
别人的总结 1.Struts2 1)commons-fileupload :2)common-io:文件上传 3)commons-lang:它扩展了标准 java.langAPI ArrayUtils ...
- java hasmap对象的深复制实现:字节码复制和对象序列化成字符串复制比较。
/** * Created by Administrator on 2016/11/23. */ public class test { public static void main(String[ ...
- HBase协处理器的使用(添加Solr二级索引)
给HBase添加一二级索引,HBase协处理器结合solr 代码如下 package com.hbase.coprocessor; import java.io.IOException; import ...
- python常见的PEP8规范
1. 括号中使用垂直隐式缩进或使用悬挂缩进 缩进 每级缩进用4个空格 示例: (垂直隐式缩进)对准左括号 def function_name(var_one,var_two, var_three,va ...
- rootless内核保护开关
关闭: csrutil disable 需要重启. 开启: csrutil enable 查看状态: csrutil status
- 如何下载中文语言包让Eclipse汉化?
Eclipse软件是JAVA开发必备的软件,对于英语不好的人而言面对英文代码还好,但是软件也是英语的那就头疼了,怎么解决?可以去官网下载中文语言包解压到Eclipse安装目录就可以汉化了. 工具/ ...
- 条款47:请使用traits class表示类型信息
在stl的算法中,我们的希望往往是根据不同的迭代器类型进行不同的更有效率的操作: template<typename IterT, typename DistT> void advance ...
- nyoj-211-Cow Contest(floyd算法)
题目链接 /* Name:nyoj-211-Cow Contest Copyright: Author: Date: 2018/4/27 21:02:06 Description: floyd算法 大 ...
- VSCode使用正则表达式进行内容替换
首先描述一下我要达到的目的: 1.源数据: 2.目标数据: 3.使用的正则表达式如下: (id: (\d+),) id: $2, \n order: $2,