OBJ-C block + protocol 学习笔记

来源:互联网 发布:软件测试经典案例 编辑:程序博客网 时间:2024/06/05 10:36
================================================================
                                             block + protocol
===============================================================


block类型是一个C级别的语法和运行机制。  


------------------------------------------------


block变量的定义格式:


int multiplier = 7;
int(^myBlock)(int) = ^(int num){return num * multiplier;};


^符号将myBlock声明为一个块对象;
myBlock是块对象,返回整型值;
它有一个参数,参数的类型也是整型值;
参数的名称是num; 


-----------------------------------------------


无参无返回值:void(^变量名)() = ^(){代码块语句;};
有参无返回值:void(^变量名)(参数类型及个数) = ^(形参列表){代码块语句;};


--------------------------------------------------


block的typedef


利用typedef定义block类型(和指向函数的指针很像)


例如:


typedef int(^Block)(int) 是给返回值是int类型并且有一个int类型参数的block语句块起别名,别名为Block。


------------------------------------------------------------


block访问外部变量


当定义block的时候,block会把外部变量以const的方式复制一份,然后存放到block所在的内存中。
注意:block中访问的外部变量,其地址与外部变量的地址不同;


如果在block内部定义的变量,是存到栈区的。


给block的外部变量前面加上__block修饰,则这个变量可以在block内部修改。而且,在修改之后,在block里被修改的变量,到block外部访问使用时,其值和地址都变成了block修改之后的。


-----------------------------------------------------------------


block分为3种:全局block,栈block,堆block;


---------------------------------------------------


block作为函数的返回值


步骤:


1.使用typedef给block类型起个别名;
2.用新定义的类型作为函数的返回值;
3.定义block变量接收函数返回的结果;
4.执行block;


---------------------------------------------------


block使用技巧及注意


助记符:inlineblock可以调出block的格式;




==================================================================================


protocol概念及基本使用


protocol基本概念


1.定义协议:


@protocol 协议名称<NSObject>
//方法声明列表;
@end


注意:协议默认采纳NSObject的协议




2.采纳协议:


(1)类遵守协议         @interface 类名:父类名<协议名称1,协议名称2>
                        @end




(2)协议遵守协议


-------------------------------------------------------------------


protocol的使用注意


1.Protocol:就一个用途,用来声明一大堆的方法(不能声明成员变量),不能写实现;
2.只要某个类遵守了这个协议,就拥有了这个协议中的所有方法声明;
3.只要父类遵守了某个协议,那么子类也遵守;
4.protocol声明的方法可以让任何类去实现;
5.OC不能继承多个类(单继承)但是能遵守多个协议;
6.基协议:<NSObject>是基协议,是最根本最基本的协议,其中声明了很多最基本的方法;
7.协议可以遵守协议,一个协议遵守了另一个协议,就可以拥有另一份协议中的方法声明;


------------------------------------------------------------------


@required和@optional


这两个关键字的作用:
@required是必须要实现的方法,默认值。如果不实现,编译器会发出警告;
@optional是可选择实现的方法;


------------------------------------------------------------------


protocol类型限制:


1.给id类型增加限制


例如:


id<myProtocol> obj = mm; 这句话的意思是:如果等号右边的对象想赋值给obj,那么这个对象必须遵守myProtocol这个协议,即mm所在的类要遵守myProtocol这个协议。


------------------------------------------------------------------


id和instancetype的区别


1.instancetype只能作为函数或者方法的返回值;
2.id能作为方法或者函数的返回值、参数类型、也能用来定义变量;
3.instancetype能精确地限制返回值的具体类型;


-----------------------------------------------------------------


protocol代理设计模式引入


代理模式概念:传入的对象,代替当前类完成了某个功能,称为代理模式;


---------------------------------------------


协议的循环引入问题


即不用#import,用@protocol。和@class的用法差不多。
0 0