黑马程序员-[OC]学习之旅-block和protocol的概念及使用

block 的概念和使用

block是一种数据类型, 可以使用这种数据类型定义变量, 并赋值。
 block数据类型在使用前需要先定义该数据类型, 然后再使用(就像使用Person类一样, 先定义一个Person类, 然后再通过Person类声明一个Person类型变量)。
block这种数据类型用来保存一个方法、函数、一段代码
int (^block)(int,int) = ^(int n, int m){};
int (^block)(int,int) = ^(int n, int m){};

基本格式:

void (^block名)() = ^{代码块; };

使用格式:

block名();

特点:类型比函数定义多了一个^  

设置数值,有一个^,内容是{}括起的一段代码

  1.  void (^myBlock)() = ^{
  2. NSLog(@"hello");
  3. }
  4. myblock();//执行时

 block带有参数的block定义和使用

格式:void (^block名称)(参数列表)

=^(参数列表){//代码实现}

  1.  定义有参数的block 
  2. void (^sumBlock)(int ,int) = ^(int x,int y){
  3. NSLog(@"%d",x+y);
  4. }

带有参数和返回值的block

格式:返回类型(^block名称)(参数列表)

=^返回类型(参数列表){//代码实现}

  1.  定义有返回值和参数的block 
  2. int (^sumBlock2)(int ,int) = ^(int x,int y){
  3. return x+y;
  4. }
  5. //调用返回值的block
  6. NSLog(@"%d",sumBlock2(4,3));

 block 的typedef

函数指针的使用:

函数指针变量定义的一般形式:

类型说明符(*指针变量名)();

定义函数指针:技巧:  

1、把函数的声明拷贝过来

2、把函数名换成(*函数指针变量名)

3、形参名可写可不写

函数指针别名:

typedef int (*newtype)(int x,inty);

newtype f1,f2,f3;//f1实际上类型int(*f1)(int x,int y)

格式:tyepdef  返回值(^block变量名)(参数类型列表);

block访问外部变量

在block内部可以访问block外部的变量

但不可修改block外部的变量

  1.     int m = 10;  
  2.     NSLog(@"1:m = %d",m);   //10  
  3.     NSLog(@"2:m addr = %p",&m);         //栈区  
  4.       
  5.     void (^myBlock)()=^{  
  6.   
  7.         m = 100;  // 错误,m的值不能被修改  
  8.         NSLog(@"5:m addr = %p",&m);     //堆区    
  9.     };  
  10.       
  11.     NSLog(@"4:m addr = %p",&m); //栈区  
  12.     //使用  
  13.     myBlock();  

     给局部变量加上_block关键字,则这个局部变量可以再block内部进行修改

  1. //block外部定义的变量_
  2. block int m = 10;
  3. //定义block
  4. void (^myBlock)() = ^{
  5. m = 100;
  6. NSLog(@"m = %d",m);
  7. //使用block
  8. myBlock();/m = 100;

当外部变量前面加上__block  时,此时不再以const方式复制,此时可以修改变量的值。
定义的全局变量,在block内部可以修改其值;

block作为函数的返回值

步骤:

  1. //1、使用typedef定义一个新的类型
  2. typedef int(^newType)(int num1, int num2);
  3. //2、使用新的类型作为函数的返回值
  4. newType test(){
  5. newType work = ^(int x, int y){
  6. return x+y;
  7. };
  8. return work;
  9. }
  10. //3、定义变量接收函数的返回值(block类型)
  11. //4、调用block
  12. newType work2 = test();

  13. NSLog(@"work2 = %d",work2(3,6));
  

protocol概念和基本使用

protocol就是协议。

使用流程:定义协议->在类中采用指定的协议->实现协议中的方法

定义协议:

@protocol 协议名称<NSObject>默认遵守NSObject

//方法声明列表

@end

采纳协议:

类遵守协议

  1. @interface Person:NSObject <协议1,协议2>

protocol

  1. //定义协议
  2. Run.h
  3. #import <Foundation/Foundation.h>
  4. @protocol Run <NSObject>
  5. -(void)eat;
  6. @end
  7.  
  8. Work.h
  9. #import <Foundation/Foundation.h>
  10. @protocol Work:<NSObject>
  11. -(void)myWork;
  12. @end
  13. //采纳协议
  14. Person.h
  15. #import <Foundation/Foundation.h>
  16. #import "Run.h"
  17. #import "Work.h"
  18. @interface Work:NSObject<Run,Work>
  19. @end
  20. Person.m
  21. @implementation Person
  22. -(void)eat{
  23. NSLog(@"eat!!!");
  24. }
  25. -(void)myWork{
  26. NSLog(@"mywork  is studyios");
  27. }
  28. @end

Protocol其他用法

1、Protocol:就死用来声明方法,不能声明成员变量不能实现

2、只要某个类遵守这个协议,就拥有了这个协议中的方法声明

3、只要父类遵守了某个协议,那么子类也需要遵守

4、Protocol声明的方法可以让任何类去实现,Protocol就是协议

5、OC中不能继承多个类,但可以遵守多个协议

6、NSObject是基协议,是最根本的协议

7、协议可以遵守协议,一个协议遵守另一个协议就拥有了另一根协议中的声明

Protocol中的@required和@optional

@required这个方法必须要实现

@optional 这个方法不一定要实现


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值