黑马程序员—IOS基础之OC—block和protocol

来源:互联网 发布:mac qq接受文件没反应 编辑:程序博客网 时间:2024/05/21 12:40

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

                                第一章 block

一、block的概念和基本的使用
1、block的概念

block类型是一个C级别的语法和运行机制。除了包含可执行代码外,与堆区、栈区内存绑定的变量,block是一组状态数据。Objective-c和c++都源自于c语言,而我们定义的block可以兼容三种语言。block代码段是一个类型,这个类型可以定义一个存储代码段的变量。

2、block的用法

基本格式:返回值类型(^类型名)(参数的类型)=^(参数名称及类型){语句块};用^来声明一个block。

block的最简形式

void(^block)()=^{};

最复杂形式:有参有返回值

int(^myBlock)(int,int)=^(intx,int y){    return x+y;};//分号不能忘//调用int sum = myBlock(5,6);//11//myBlock是一个block类型的变量,我们可以赋值myBlock = ^(int ,int y){    return x-y;};

3、block的typedef
函数指针的typedef

//给函数指针取别名 ptypedef int(*p)(int x,int y);int sum(int x,int y){    return x+y;}//运用函数指针p=sum;//p指向sumint s = p(1,1);//2

2、block的typedef

//定义一个block的类typedef void(^Block)();//利于Block定义类Block b1;//连续定义多个Block b2,b3,b4;//初始化b1 = ^{NSLog(@"b1是个block类型");}

二、block的高级使用
1、block访问外部变量

int m = 10;void (^myBlock)()=^{//可以访问m这个变量//因为在定义block时,block会把外部变量的值拷贝一份存放到block所在的内存中,在堆区。//不能修改m的值,因为拷贝的时候是以const的方式拷贝的,const修饰的值表示的是无法修改//非要修改的话,在外部定义变量时这么写:__block int m = 10;此时在block内部就能修改m=100;//在block内部创建的值存放在栈区int x=1;NSLog(@"%d",m);}//如果用__block修饰了变量,而且在block使用了得话,那么以后所有对m的访问都是在block内部

2、block的几种方式

(1)全局block:函数外面,若在里面,那么不能捕获局部变量(2)栈block区别是否引用外部变量(3)堆block对栈block copy得来,对全局的block copy没用注意:block内部变量时只读的对定义的全局变量可直接在block中修改

3、block作为函数的返回值

//定义block类型btypedef void(^b)();B test(){B  w1 = ^{NSLog(@"lala");};    return w1;}//调用B t = test();//执行t();

4、block的使用技巧

(1)inlineblock助记符:快速写出格式(2)我们定义block变量时可以在形参类型及个数位置处加上形参名称。即:
void(^block)(int x,int y)=^(int x,int y){};
                        第二章  Protocol

一、protocol概念及基本使用
1、protocol的基本使用
OC中,借口由协议的protocol来实现的,protocol定义了一大堆方法,并未实现。

.h定义协议ClassA.h类声明的时候采纳协议ClassA.m实现协议对应的方法

定义协议

@protocol 协议名称<NSObject>//系统默认遵守NSObject//方法声明列表@end

采纳协议

@interface 类名:父类<协议名称1,协议名称2,协议名称3>@end

注意:协议也能遵守其他协议,协议的作用是供其他类遵守。
如果遵守一个协议就应该实现这个协议定义中必须要实现的方法。
结论:当我们遵守一个协议的时候,就有了协议中方法的声明。
2、protocol的使用注意

(1)protocol一个用途用来声明一大堆方法(2)遵守协议就有了协议的所有方法(3)父类遵守协议,那么相应的子类也应该遵守(4)protocol声明的方法可以让任何类去实现(5)OC不能继承多个类,但是能遵守多个协议(6)基协议(7)协议也能遵守其他协议

3、protocol基协议介绍

NSObject中有很多编译器提供的方法,遵守NSObject就能够拥有这些方法,就能在程序运行中调用这些方法,这些方法是不用在实现,但是我们可以重写。

4、@required和@optional

@required必须要实现的方法@optinal选择实现的方法如果不加关键字修饰,默认都是必须要执行的
@protocol playgameProtocol<NSObject>//@required必须执行的方法,作用域遇到下一个关键字或者@end@required-(void)study;-(void)exam;-(void)exerise;//@optional选择执行的方法,作用域遇到下一个关键字或者@end@optional-(void)fighting;-(void)love;@end

5、protocol类型限制

//1、增加类型限制Dog *d = [Dog new];Girl *mm=[Girl new];//表示lala只能赋值了遵守houseHold协议的对象id<houseHold> lala=mm;//2、表示对象是Girl对象,并且遵守houseHold协议Girl<houseHold> lala=mm;//3、对象关联关系下得限制@property(nonatomic,strong)Dog<>*dog;

二、protocol代理设计模式
MVC
m->model
v->view
c->controller

主要思路: (1)定义一个协议,声明代理类需要实现的方法列表 (2)创建一个代理类(3)在需要代理类中,定义对象类型为id类型,且遵守代理协议的成员变量。(4)在需要代理类中调用成员变量_delegate(代理)的方法调用代理方法。(5)在main.m或其他类中使用,个需要代理类赋值使用。应用场合:(1)监听器场合(2)通知的场合(3)有些自己不想做的事,交给别人做

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

0 0
原创粉丝点击