黑马程序员---OC基础---Block、分类Category、协议protocol

来源:互联网 发布:手游网络加速器排行 编辑:程序博客网 时间:2024/05/29 12:31

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、Block

Block是iOS中一种特殊的数据类型,不同于int、float等数据类型,Block变量是用来保存一段代码的,因此代码从此也可以作为参数传递,功能类似于函数和方法
1.用途:
1)封装一段代码,可在任意时刻执行
2)可以作为函数的参数或函数的返回值
3)苹果官方建议使用Block(用于动画、多线程、集合遍历、网络请求回调等)
2.格式:
返回值类型 (^block变量名)(形参列表) = ^(形参列表){ 代码段 };例:
int (^blockSum)(int,int) = ^(int a,int b){    int sum = 0;    sum = a+b;    return sum;}
这里用Block型封装了一段求两个整形数的和的代码段,调用如下代码:
int sum = blockSum(3,5)
3.利用typedef给Blocklei类型取别名,例:
typedef  int  (^MyBlock)(int,int);MyBlock  sum;//sum实际形式如下,是一个有两个形参,返回值为int型的代码块int  (^blockSum)(int,int);
4.使用技巧:利用助记符(inlineBlock)进行格式提示,可以帮助记忆

二、分类Gategory

Gategory翻译过来可以叫分类、类别或者类目,是OC中特有的语法,类似于C#中的“扩展方法”和“partial”关键字
1.作用
1)在不修改原来类的基础上,为该类扩充一些新方法
2)一个庞大的类可以分模块开发,储存在不同文件中
3)庞大的类可以由多人编写,有利于团队合作
2.目的
1)对现有类进行扩展
2)作为子类的替代手段,直接向类增加方法
3)对类中方法归类,便于更新和维护
3.步骤
——创建新的分类文件命名规则:类名+分类名称
1)声明
——格式:@interface 待扩展类(分类名称) @end
@interface  Person(base)-(void)run;@end
这里在Person类的base分类中加入了run方法
——实现:@implementation待扩展类(分类名称) @end
@interface  Person(base)-(void)run{    NSLog(@"人会跑");}@end
注意在声明中引入"Student.h",实现中引入"Student+Base.h"
4.注意
1)分类只能增加方法,不能增加成员变量
2)分类中可访问原来类的成员变量
3)若分类中与原来类有同名方法,优先使用分类方法
4)若多个分类中都有同名方法优先执行最后编译的分类方法
5.Gategory非正式协议
非正式协议即类别,凡是NSObject或者其子类的类别,都是非正式协议
6.类的延展(Extension)
——概念:也叫延展类别、扩展,是特殊的类别
——作用:可以为类添加额外的实例变量、方法或合成属性
@interface  Person(){    int  age;}-(void)run;@end
    ——注意:延展类通常放在原类.m文件中,方法的实现只能在原类的.m文件,不能新建.m文件在@implementation Person()实现

三、协议Protocol

Protocol可以声明一些必须实现的方法和选择实现的方法
1.使用流程
新建Source文件选择Object-C中的Protocol
1)定义Protocol
@protocol  MyProtocol<NSObject>        //定义一个协议名为MyProtocol的协议,且遵守NSObject协议-(void)run;                            //声明一个遵守本协议后必须实现的方法@end
2)采纳协议
@interface  Person:NSObject<MyProtocol>    //Person类遵守此协议(可以遵守多个协议)@end
3)实现协议
在类的.m文件中实现协议中的方法
2.使用注意
1)Protocol中可以声明多个方法,不能声明成员变量
2)类拥有协议的所有方法声明
3)子类也遵守父类的协议
4)Protocol声明的方法可以让任何类去实现
5)OC中不能继承多个类,但可以遵守多个协议
6)基协议<NSObject>是最根本的协议,它声明了很多最基本的方法
7)一个协议在声明的时候也可以遵守另外的协议
3.@required和@optional(主要用于程序员交流)
——@required表示该方法必须实现(默认)
——@optional表示后面的方法可以选择实现
@protocol  baseProtocol<NSobject>@required-(void)eat;        //本方法必须实现@optional-(void)run;        //本方法选择实现@end
4.Protocol代理设计模式
传入的对象代替当前类完成某项功能(代替实现某些方法),称为代理模式
1)目的
——解耦(主类不在依赖特定某个类型,而是依赖代理,而很多类型都可以作为代理)
——增加程序的灵活性、可扩展性
——通知、事件监听……
2)思路&步骤
——定义协议:声明代理需要实现的方法
——创建一个delegate(代理)类,遵守上面协议
——在需要代理的类中,定义一个遵守代理协议的id类型的成员变量
——在需要代理类方法中调用代理类方法
——在main.m或其他需要代理类的文件中,为代理类成员变量赋值
补充:.h文件中@protocol是告诉编译器这是个协议,在.m文件中导入协议文件


0 0
原创粉丝点击