黑马程序员——OC语法,封装block和协议protocol

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

一、block

1.block基本认识

<1>.block是一种数据类型。
<2>.block类型的数据封装了一段代码,可以在任何时候执行。
<3>.block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。
<4>.block的作用:封装一段代码,以便随时调用,简称代码块
<5>.block跟函数很像:

1>可以保存代码
2>有返回值
3>有形参
4>调用方式一样

2.block变量的定义、赋值、调用

<1>.block类型的标志:^
<2>.block变量的定义、赋值、调用

block的形式和指向函数的指针非常相似

//定义函数指针: 返回值int类型,2int类型形参
int (*p)(int, int);

//定义Block: 返回值int类型,2int类型形参
int (^sumBlock)(int, int);

定义一个block类型变量,保存一段求和代码

//1.定义Block变量sumBlock,返回值int,2个形参int
int (^sumBlock)(int, int);

//2.给sumBlock封装一段代码(如果没有形参,^后面的()可以省略)
sumBlock = ^(int a, int b)
{
    return a + b;
};
//3.调用sumBlock代码块,得到返回值
int c = sumBlock(7, 8);

注意:封装代码完后,大括号后面一定要加分号;

3.block访问外面变量

<1>.block内部可以访问外面的变量
<2>.默认情况下,block内部不能修改外面的局部变量
<3>.给局部变量加上_block关键字,这个局部变量就可以在block内部修改

int main()
{
  int a = 5;

  _block int b = 10; //给局部变量加上_block关键字,这个局部变量就可以在block中修改

  void (^block1)();  //定义block类型的变量为block1,并且省略形参类型
  block1 = ^{ //给block1赋值(把代码块存入block1)
      //1.block内部可以访问外面的变量
     NSLog(@"a = %d", a);

       //2.默认情况下,block内部不能修改外面的局部变量
      // a = 15;
      //给局部变量加上_block关键字,这个局部变量就可以在block中修改
      b = 20;

   };

      block1(); //调用block1中封装的代码块
      return 0;
}

4.利用typedef定义block类型

//以后就可以利用myBlock这种类型来定义block变量
typedef int (^myBlock)(int, int);

myBlock b1;

b1 = ^(int a, int b){
   return a + b;
};

或者另一种表达方式
myBlock b2 = ^(int a, int b){
   return a - b; 

};

二、protocol(协议)

1.protocol的用途

<1>.将一大堆方法声明(不能声明成员变量)写在protocol协议中,只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明。

<2>.只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明
<3>.只要父类遵守了这个协议,就相当于子类也遵守了。

<4>.常用于设计模式:代理模式、观察者模式

2.protocol的协议格式

<1>.协议的编写

@protocol 协议名称 <NSOjbect>
  方法声明列表
@end

<2>.某个类遵守协议

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

3.关键字@required和@optional

协议中有2个关键字可以控制方法是否要实现(默认是@required),在大多情况下用途在于程序员之间的交流

<1>.@required:这个方法必须要实现,如果没有实现会发出警告
<2>.@optional:这个方法不一定要实现,怎样都不会有警告

4.协议遵守协议

<1>.一个协议可以遵守其他多个协议,多个协议之间用逗号隔开
<2>.一个协议遵守了其他协议,就相当于拥有了其他协议中的方法声明

5.基协议

<1>.NSObject是一个基类,最根本最基本的类,任何其他类最终都要继承它
<2>.其实还有一个协议,名字也叫NSObject,他是一个基协议
<3>.NSObject协议中声明很多最基本的方法,比如:description,retain,release等
<4>.建议每个新的协议都要遵守NSObject协议

6.定义一个变量的时候,限制这个变量保存的对象遵守某个协议

格式

<1>.类名 <协议名称> *变量名;

NSObject <Myprotocol> *obj;

<2>.id <协议名称> 变量名;

id <Myprotocol> obj2;

7.@property中声明的属性也可用做一个遵守协议的限制

格式

@property (nonatomic, strong)类名<协议名称> *属性名;
@property (nonatomic, strong) id<协议名称>属性名;

举例

@property (nonatomic, strong) Dog *dog;
@property (nonatomic, strong) id dog2;

8.协议的文件结构

协议可用定义在单独.h文件中,也可用定义在某个类的.h文件中

<1>.如果这个协议只用在某个类中,应该把协议定义在该类.h文件中

<2>.如果这个协议用在很多类中,就应该定义在单独文件中

9.分类可用定义在单独.h和.m文件中,也可用定义在原来类中

<1>.一般情况下,都是定义在单独文件
<2>.定义在原来类中的分类,只要求能看懂语法

10.协议的应用 ->代理模式

普通题目:一个人让一个代理帮他买电影票,内容是票价多少钱?还剩多少张?

分析思路

这种情况下,我们就可以把a当做是p的代理。

<1>.创建一个Person类型的对象p

<2>.创建一个Agent类型的对象a,

<3>.在p中定义一个Agent类型对象成员,将a赋值给p的Agent类型对象

<4>.在Agent类中实现【买票过程】这个对象方法

<5>.Person中实现【买票】方法,买票方法中直接调用Agent中的【买票过程】方法

通过这种思路,我们就不需要关心a的买票过程,需要买票时,只要调用代理的方法就好了

升级题目:如果让另一个代理买呢 —>解析:只需要定义一个买票的协议,只要遵守这个协议,任何人都行
黑马程序员——OC语法,封装block和协议protocol_第1张图片
黑马程序员——OC语法,封装block和协议protocol_第2张图片
黑马程序员——OC语法,封装block和协议protocol_第3张图片
黑马程序员——OC语法,封装block和协议protocol_第4张图片
黑马程序员——OC语法,封装block和协议protocol_第5张图片

你可能感兴趣的:(已经完成的博客)