1.block的概念
block类型是C语言级别的语法和运行机制。可以理解成block类型存储代码块。
可以让函数返回一个block代码块。也可以让block作为函数的参数。
无参数无返回值:
void (^block变量名) ( ) = ^(){ 代码块语句};
优化: void (^block变量名) ( ) = ^{ 代码块语句};
无参数有返回值:
返回值类型 (^block变量名) () =^(){ 代码块语句 return; };
有参数无返回值:
void (^block变量名)(参数类型及个数)=^(形参列表){ 代码块语句 };
定义变量,再赋值:
void (^myBlock) (int ,int ) = ^(int a ,int b){return NSLog(@"a + b = %d",a+b);}
myBlock(1,2);
定义变量的同时赋值:
myBlock= ^(int a ,int b){return NSLog(@"a + b = %d",a+b);}
myBlock(1,2);
有参数有返回值:
返回值类型 (^block变量名)(参数类型及个数)=^(形参列表){ 代码块语句 return; };
2.block的typedef
函数指针的别名:typedef int (*NewType)(int ,int ); NewType f1,f2;//f1,f2为函数指针类型的变量
block与其类似:typedef 返回类型 (^新类型名)();
3.block访问外部变量
block会把外部变量以const的方式复制一份,不能更改。
用_ _block定义后,不以const方式复制,可以修改外部变量,修改的是复制过后的值。以后使用的变量都是复制后的那个,而不是开始定义的那个。
__block int m =10;
void (^myBlock)() = ^{ m =100;NSLog(@"%d",m);}
NSLog(@"%d",m);
//两个m值都是100
分类:栈block 堆block 全局block
全局变量在block内部直接可以修改。
4.block作为函数的返回值
使用typedef定义block类型 ,作为返回类型。
5.block的使用技巧以及注意
助记符:inlineBlock
助记符可以自己创建。<# #>
加上形参名称,有利于使用快捷方式。
6.协议的概念 protocol
OC中,可以定义一个类必须实现某个方法妈?
一般在.h文件中定义一个协议,声明一些方法,供其他的类去遵守,一旦采纳这个协议,就必须实现协议中定义的必须实现的方法。
协议的使用流程:
先定义(.h),然后采用协议(.h),实现协议中的方法(.m,方法是必须实现,也可 选择实现)。
注意导入头文件。
定义:
@protocol 协议名 <NSObject> //默认的协议
//方法声明列表
@end
采纳:
@interface 类名 :父类< 协议名,...>
@end
实现:在.m文件中实现方法。
一个协议可以遵守其他的协议;一个类可以遵守多个协议;
一个协议也可被多个类遵守;协议可以被继承;
NSObject的协议是 基协议。任何协议都遵守基协议。
protocol中的@required和@optional :
@required 必须要实习的
@optional 选择实现的
protocol的类型限制:定义变量时,可以使用<协议>来限制过滤赋值。
id和instancetype的区别:
- instancetype只能作为方法或者函数的返回值
- id可以定义变量,也可以作为返回值
- instancetype的好处是可以精确的限制返回值的类型
protocol代理模式的设计引入:
一个类的行为是别的类帮其实现的。
MVC的开发模式。model view controller
代理对象名为delegate 类型为id类型<协议>过滤。一定要给delegate对象赋值。不然无法使用。