第一讲 分类与延展
1、分类概念及作用
Category有很多种翻译: 分类 \ 类别 \ 类目 (一般叫分类)
Category是OC特有的语法
类别的作用
再不修改原有的类的基础上增加新的方法
一个庞大的类可以分模块开发
一个庞大的类可以由多个人来编写,更有利于团队合作
2、使用类别的步骤
先声明类别--->实现类别--->使用类别
Person
base -- 张三 ( Person+base)
eat run
playgame-- 李四 (Person+playgame)
playlol,playdota
study --麻子 (Person+study)
studyc studyios
注意:类别的命名规则:类名+扩展方法,如“ NSString+countNum” 。
类别的接口声明与类的定义十分相似,但类别不继承父类,只需要带有一个括号,表明该类别的主要用途。
3、分类的声明和实现
在.h文件中,声明类别:
@interface ClassName (CategoryName)
NewMethod; //在类别中添加方法
//不允许在类别中添加变量
@end
说明:
声明类别格式
1)新添加的方法必须写在 @interface 与 @end 之间
2) ClassName 现有类的类名(要为哪个类扩展方法)
3) CategoryName 待声明的类别名称
4) NewMethod 新添加的方法
注意:不允许在声明类别的时候定义变量
在.m文件中(也可以在.h中实现),实现类别:
@implementation ClassName(CategoryName)
NewMethod
{
……
}
@end
说明:
实现类别格式
1)新方法的实现必须写在 @ implementation与@end之间
2) ClassName 现有类的类名
3) CategoryName 待声明的类别名称
4) NewMethod 新添加的方法的实现
4、分类的使用注意事项
1) 分类只能增加方法, 不能增加成员变量、 @property(可能编译不报错,但是运行有问题)
2) 分类可以访问原来类中的成员变量
3) 如果分类和原来类出现同名的方法, 优先调用分类中的方法, 原来类中的方法会被忽略
当多个分类中有同名方法,则执行最后编译的文件方法
5、分类非正式协议
非正式协议就是给NSObject类创建的类目(分类)又叫做非正式协议, 非正式协议一般不需要进行实现,一般在子类中进行方 法的重写。
应用:统计一个字符串中阿拉伯数字的个数
@interface NSString (count)
-(void)countStrNum;
@end
@implementation NSString (count)
-(void)countStrNum{
int count=0;
//遍历字符串
for(int i=0;i<self.length;i++){
//获取字符串的每一个字符
unichar c = [self characterAtIndex:i];
//判断是否是阿拉伯数字
if (c>='0' && c<='9') {
//如果是阿拉伯数字,则+1
count++;
}
}
NSLog(@"count = %d",count);
}
6、类的延展
延展类别又称为扩展( Extendsion)
Extension是Category的一个特例
其名字为匿名(为空),并且新添加的方法一定要予以实现。(Category没有这个限制)
@interface Student ()
@end
实现:
第一种、通过延展来实现方法的私有,延展的头文件独立。这种方法不能实现真正的方法私有,当在别的文件中引入延展的头 文件, 那么在这个文件中定义的类的对象就可以直接调用在延展中定义所谓私有的方法
第二种、实现延展的方式是延展没有独立的头文件,在类的实现文件.m中声明和实现延展,这种方法可以很好的实现方法的私有,因为在OC中是不能引入.m的文件的
第二讲 协议和代理
1、protocol的基本概念和使用流程
在OC中,接口是由一个叫做协议的protocol来实现的。
它可以声明一些必须实现的方法和选择实现的方法。
协议的使用流程:定义协议----> 在类中采用指定的协议
1)协议的定义
@protocol 协议名称 <NSObject> //默认遵守NSObject协议
//方法声明列表
@end;
注意:协议默认的要采纳NSObject的协议
2)采纳协议
(1)类遵守协议
创建类的时候遵守某个或者某几个协议
@interface 类名 : 父类 <协议名称>
@end
@interface 类名 : 父类 <协议名称1,协议名称2>
@end
某个协议也遵守某个或者某些协议,一个协议可以遵守其他多个协议,
(2)协议遵守协议
@protocol 协议名称 <其他协议名称>
@end
多个协议之间用逗号 , 隔开。
@protocol 协议名称 <其他协议名称1, 其他协议名称2>
@end ---->实现协议中的方法(注意方法有必须实现和选择实现两种)
3)实现协如果一个类遵守了某个协议
则只需要在这个类的实现( .m)文件中,实现协议的方法就可以了议中的方法
2、OC中的协议( protocol)使用注意:
1) Protocol:就一个用途,用来声明一大堆的方法(不能声明成员变量),不能写实现。
2)只要某个类遵守了这个协议, 就拥有了这个协议中的所有方法声明。
3)只要父类遵守了某个协议,那么子类也遵守。
4) Protocol声明的方法可以让任何类去实现, protocol就是协议。
5) OC不能继承多个类(单继承)但是能够遵守多个协议。 继承(:),遵守协议( < >)
6)基协议: <NSObject>是基协议,是最根本最基本的协议,其中声明了很多最基本的方法。
7)协议可以遵守协议,一个协议遵守了另一个协议,就可以拥有另一份协议中的方法声明
3、protocol中@required和@optional
@required和@optional是 协议方法声明中的两个关键字
他们主要用于控制方法是否要实现(默认是@required),在大多数情况下,
用途在于程序员之间的交流
@required:这个方法必须要实现(若不实现,编译器会发出警告)
@optional这个方法不一定要实现
4、protocol类型限制
1)使用id存储对象时,对象的类型限制
格式:id <协议名称> 变量名
如: id <Myprotocol> obj1;
2)对象赋值时类型限制
使用类也同样如此
格式:类名<协议名称> *变量名
NSObject<Myprotocol> *obj;
3)id和instancetype的区别
(1) instancetype只能作为函数或者方法的返回值
(2) id能作为方法或者函数的返回值、参数类型,也能用来定义变量
(3) instancetype对比id的好处: 能精确地限制返回值的具体类型
5、代理模式
protocol代理设计模式概念
传入的对象,代替当前类完成了某个功能,称为代理模式
利用协议实现代理模式的主要思路为:
1)定义一个协议,里面声明代理类需要实现的方法列表, 比如这里一个代理类需要实现feedBaby与HongSleep方法
2) 创建一个代理类(比如BaoMu),遵守上面的代理协议
3)在需要代理的类中(Baby),定义一个对象类型为id且遵守代理协议的成员变量
4)在Baby类中调用成员变量_delegate(代理)的方法,调用代理类的方法
5) main.m或其他使用Baby类的文件中,为Baby类的成员变量(代理类)赋值
protocol代理模式应用场合
代理设计模式的场合:
当对象A发生了一些行为,想告知对象B (让对象B成为对象A的代理对象)
对象B想监听对象A的一些行为 (让对象B成为对象A的代理对象)
当对象A无法处理某些行为的时候,想让对象B帮忙处理 (让对象B成为对象A的代理对象)