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

——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

//给函数指针取别名 p
typedef int(*p)(int x,int y);
int sum(int x,int y){
    return x+y;
}
//运用函数指针
p=sum;//p指向sum
int 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类型b
typedef 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
//方法声明列表
@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
//@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 lala=mm;
//2、表示对象是Girl对象,并且遵守houseHold协议
Girl 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培训、期待与您交流! ——

你可能感兴趣的:(ios开发)