一、block代码块
1、本质上代码块支持在代码中内连的定义一个函数对象,这些对象可以通过变量来访问,同时可以当作参数传递到其他函数中去。
2、默认情况下代码块内部可以访问外部变量,但在代码开内部不能修改局部变量的值。
3、给局部变量加上__block关键字,这个局部变量就可以在block内部修改了。
4\指向函数的指针 int (*p)(int ,int )= sum;
5 如何定义block变量 int (^myBlock)(int ,int) ;void (^yourBlock)();
6如何用block变量封装一段代码^{ };^(int a, int b){return a+b;};
7\block访问外部变量,1block内部默认可以访问外部变量2block内部不可以修改外面的局部变量的值3给局部变量加上—block,这个变量就可以在block内部进行修改。
8、使用typedef定义新类型,typedef (^myBLock)(int ,int);以后就可以使用myblock这种类型定义新变量。myblock a ,b;
- //block本身是变量,他的标志是^.跟函数很像,1都可以保存代码,2有返回值,3可以传递参数。在运行中创建一段代码保存起来
- //为了增加程序的可读性,一般给变量定义个别名,这里有个主意,typedef是定义类型,而下面代码等号后面的是初始化,定义了类型,后面的初始化也是要写的。
-
- typedef int(^MyBlock)(int,int);
-
- //下面这个block声明和定义写在一起,这个block变量的名字叫做sumblock
- //int (^sumblock)(int, int) = ^(int a, int b){
- // return a+b;
- //}
-
- //调用方法与函数一致
- sumblock(10,11);
- int main()
- {
- //MyBlock就是一个变量类型,addblock就是一个变量。
- //利用block封装一段代码。
- MyBlock addBlock = ^(int a, int b){
- return a+b;
- }
-
- MyBlock minusBlock = ^(int a,int b){
- return a-b;
- }
-
- minusBLock();//调用block;
- addBlock();//调用block;
- }
-
二、protocol协议
1、可以声明一大堆方法等着别人去实现,但不能声明成员变量。是一个头文件
2、只要某个类遵守了这个协议,就想当于拥有了这个协议中的所有方法的生命。
3、只要父类遵守了默个协议,就相当于子类也准首了这个协议。
4、协议遵守协议,相当于拥有了其他协议中的方法声明。
5、基协议NSObject,基协议是声明在Foundation框架中的,在自定义一分协议的时候,一定要遵守基协议。
6、限制对象类型,在类名后面加上<Myprotocol>
7、一个协议是一份头文件,是可以定义在类的头文件中的,用@protocol@end扩上即可,但这个协议只用在当前类里面,协议写在这个类里面就可以了
。写分类的目的是让原来的文件不修改而添加方法,分类也是可以写在类里面的,当分类的方法的时候可以写在原来的类里面。分类用括号(),协议用<>括号。
8 OC是单继承 ,但一个类可以遵守多个协议。
9@proproty中声明的属性也可以做一个遵守协议的规定,@property (noautomic,strong)类名<协议名> *属性名。
@properry (noatuomic ,stong)id<协议名> 属性名。
- //协议文件格式,头文件
- #import <Foundation/Foundation.h>
- //协议需要有类区遵守。
- @protocol MyProtocol
- //协议里面只是生命方法,等待别人去类实现
- //协议里面可以对方法进行约束,@required默认必须实现, @optional。方法声明的关键字
- @end
-
- //Person类文件.h
- #import <Foundation/Foundation.h>
- #import "MtProtocol.h"
- @interface Person:NSObject <MyProtocol>遵守协议
- //方法声明列表
- @end
-
- //Person类文件.m
- #import “Person.h"
- @implementation Person
- //文件一旦遵守了协议,就要实现协议里面的必须实现的方法。
- @end
-
- NSObject<MyProtocol> *obj1 = [[Person alloc] init];
- id<MyProtocol> obj2 = [[Person alloc] init];
- //一个对象遵守了某个协议,并继承Person
- Person<MyProtocol> object = [[Person alloc] init];
- //在调用set方法的时候传入的对象一定要遵守这个协议
- @property <noautomic, strong> id<Myprotocol> obj;
-
- //协议的提前声明
- @class声明一个类,里面有什么无需关注,当用到类里面的东西的时候才需要关注
- @protocol声明一个协议,里面是什么无需关注,当到真正用到里面的东西的时候用#import
初步了解代理设计模式,一件事对象本身不想做,可以叫代理帮它做。
- //首先一个类要拥有代理属性,代理对象
- @property (nonatomic, retain ) id<Protocol> delegate;
- //编写一个协议,要代理拥有哪些方法。
- 一个类要想当代理,必须实现代理协议,换个代理,代理只要实现这个协议就可以了。