黑马程序员---OC基础8【block类型】【Protocol】

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

【block类型】

1、block概念

    block对象是一个C级别的语法和运行机制,不同之处,它除了有可执行代码以外,它还包含了与堆栈内存绑定的变量

    方法的回调

    block是一个类型,定义变量,用来存储代码块

2、block基本用法

    block与函数很相似,有返回值类型,参数类型,主体;

    返回值类型 (^block变量名)(形参列表) = ^(形参列表) {

    };

    没有参数可以写void,比如:int (^blockname)(void);

 1 1、block概念
 2     block对象是一个C级别的语法和运行机制,不同之处,它除了有可执行代码以外,它还包含了与堆栈内存绑定的变量
 3     方法的回调
 4
 5     block是一个类型,定义变量,用来存储代码块
 6
 7 2、block基本用法
 8     block与函数很相似,有返回值类型,参数类型,主体;
 9     • Block的组成要素跟函数类似
10     • 返回值
11     • 形式参数
12     • 实际参数
13     • Block的定义格式
14     返回值类型 (^block变量名)(形参列表) = ^(形参列表) {
15
16     };
17     没有参数可以写void,比如:int (^blockname)(void);
18
19     #import <Foundation/Foundation.h>
20
21     int main(int argc, const char * argv[]) {
22         @autoreleasepool {
23             /*
24              有参有返回值
25              格式: 返回值类型 (^block变量名)(参数类型及个数)= ^(形参列表){
26                     代码块的语句;
27                     return ;
28              };
29              block变量的使用
30              block变量名(实参);
31              
32              有参无返回值
33              格式: void (^block变量名)(参数类型及个数)= ^(形参列表){
34                         代码块的语句;
35                     };
36              block变量的使用
37              block变量名(实参);
38              无参有返回值
39              
40              无参无返回值
41              格式: void (^block变量名)()= ^(){
42                     代码块的语句;
43                     };
44              优化:
45              void (^block变量名)()= ^{
46              代码块的语句;
47              };
48              block变量的使用
49              block变量名();
50              */
51             void (^myBlock)()= ^{
52                 NSLog(@"******");
53             };
54             myBlock();
55             //定义一个变量myBlock1,同时进行赋值
56             void(^myBlock1)(int,int)=^(int a,int b){
57             
58                 NSLog(@"a+b= %d",a+b);
59             };
60             myBlock1(10,20);
61             //定义一个变量myBlock1,后进行赋值
62             myBlock1 = ^(int a,int b){
63             
64                 int m = a>b?a:b;
65                 NSLog(@"max=%d",m);
66             };
67             myBlock1(10,20);
68             int (^myBlock2)(int,int) = ^(int x,int y){
69                 return x+y;
70             };
71             int sum = myBlock2(10,30);
72             NSLog(@"sum=%d",sum);
73         }
74         return 0;
75     }
76
77     

3、Block的typedef

    使用typedef定义Block类型。定义好以后就可以像普通数据类型那样使用了:
    typedef 返回值类型 (^block类型名称)(形参列表);

 1 #import <Foundation/Foundation.h>
 2
 3 int main(int argc, const char * argv[]) {
 4     @autoreleasepool {
 5
 6         // 定义一个block变量,并且赋值
 7         void (^myBlock)() = ^{
 8
 9             NSLog(@"helloworld");
10
11         };
12
13         myBlock();
14
15         //定义一个别名
16         // 给 没有返回值 没有参数的block起一个别名
17         // Block 是一个类型,不在是一个单纯的变量了
18         typedef void (^Block)();
19         Block b1;
20         //block类型的变量
21         b1 =^{
22             NSLog(@"helloworld");
23         };
24
25         b1();
26
27         //定义有参数\有返回值的 block类型
28         //定义新的别名
29         //返回值是int 有两个 int类型的参数
30         typedef int (^NewType1)(int ,int );
31
32         NewType1 nt1 = ^(int a,int b){
33
34             return a+b;
35
36         };
37
38         //连续定义多个 NewType类型的变量
39         NewType1 n1,n2,n3;
40         n1 = ^(int x,int y){
41
42             return x>y?x:y;
43         };
44
45         int s = nt1(12,23);
46         NSLog(@"s = %d",s);
47
48
49     }
50     return 0;
51 }

4、block访问外部变量

  默认情况下, Block内部不能修改外面的局部变量
  Block内部可以修改使用__block修饰的局部变量
  Block调用前注意判断是否为nil,否则可能会报错

 1 #import <Foundation/Foundation.h>
 2 /**
 3  *  block内部访问外部值的问题
 4  *  block内部不允许修改外部变量值
 5  */
 6 void test(){
 7
 8     int m = 10;
 9
10     NSLog(@"1:m = %d",m);   //10
11     NSLog(@"2:m addr = %p",&m);         //栈区
12     //        NSString *str = @"abc";
13     //        NSLog(@"str = %p",str);
14
15     //定义变量,并且赋值
16     //当定义block的时候,block会把外部变量以const的方式复制一份
17     //存放到block的所在的内存中
18     void (^myBlock)()=^{
19         //m的值不能被修改
20         //m = 100;
21
22         NSLog(@"5:m addr = %p",&m);     //堆区
23         //可以访问m的值
24         NSLog(@"3:in block m = %d",m);  // ?
25
26     };
27
28     NSLog(@"4:m addr = %p",&m); //栈区
29     //使用
30     myBlock();
31
32
33     // 1 2 4 5 3
34
35
36 }
37 //int n=0;
38 int main(int argc, const char * argv[]) {
39     @autoreleasepool {
40
41         __block int m = 10;
42         NSLog(@"1:m add  = %p",&m);   //栈区地址
43
44         //__block 不在以const的方式拷贝
45         void (^myBlock)()=^{
46             //m的值不能被修改
47             m = 100;
48 //            n = 10;
49 //            int m = 100;
50             NSLog(@"5:m addr = %p",&m);     //堆区
51             //可以访问m的值
52             NSLog(@"3:in block m = %d",m);  // ?
53
54         };
55         myBlock();
56
57         NSLog(@"6:m = %d",m);  // ?
58         NSLog(@"7:m addr = %p",&m);
59
60     }
61     return 0;
62 }

  

 【Protocol】

1、protocol概念

  Protocol翻译过来, 叫做”协议”
  中文解释:经过谈判、协商而制定的共同承认、共同遵守的文件。遵守了协议意味着一定会做协议中规定的事情。
  Protocol的作用
  用来声明一些方法
  也就说, 一个Protocol是由一系列的方法声明组成的
  任何类只要遵守了Protocol, 就相当于拥有了Protocol的所有方法声明

2、Protocol的定义
  @protocol 协议名称
  // 方法声明列表
  @end

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

  协议中有2个关键字可以控制方法是否要实现(默认是@required,在大多数情况下,用途在于程序员之间的交流)
  @required:这个方法必须要实现(若不实现,编译器会发出警告)
  @optional:这个方法不一定要实现

3、Protocol使用流程

4、protocol中的@required 和 @optional

 1 #import <Foundation/Foundation.h>
 2
 3 @protocol baseProtocol <NSObject>
 4 //@required 和 @optional 都是协议中的关键字
 5 //@required 修饰的方法是必须要实现的
 6 @required    //默认情况下都是必须要实现的
 7 -(void)run;
 8 -(void)eat;
 9
10 //@optional 修饰的方法是可以实现,也可以不实现的
11 @optional
12 -(void)dajia;
13
14 @end

5、协议遵守协议
  一个协议可以遵守其他多个协议
  一个协议遵守了其他协议,就相当于拥有了其他协议中的方法声明
  @protocol 协议名称 <协议1, 协议2>
  @end
  基协议
  NSObject是一个基类,最根本最基本的类,任何其他类最终都要继承它
  还有名字也叫NSObject的协议,它是一个基协议,最根本最基本的协议
  NSObject协议中声明很多最基本的方法

  建议每个新的协议都要遵守NSObject协议
  注意
    代理设计模式的主要目的:
    解耦(主类不再依赖特定的某个类型,而是依赖代理,而很多类型都可以作为代理)
    增加了程序的灵活性、可扩展性
    Protocol(协议)是实现代理的一种手段。

  补充:
      用协议的原因:
    1.有时候很难抽象共同的父类
    2.类只能单继承。
    3.解耦,不再依赖于某个具体的类型,任何类型都可以, 只要遵守了协议。

时间: 2024-07-28 21:00:06

黑马程序员---OC基础8【block类型】【Protocol】的相关文章

黑马程序员——OC语言的Block与Protocol(协议)

Block ● Block封装了一段代码,可以在任何时候执?行 ● Block可以作为函数参数或者函数的返回值,?而其本?身又可以带输?入参数或返回值. ● 苹果官?方建议尽量多?用block.在多线程.异步任 务.集合遍历.集合排序.动画转场?用的很多 定义BLOCK变量 Int (^SumBlock)(int,int);//有参数,返回值类型为int Void (^MyBlock)()://无参数,返回值类型为空 Blocks的定义: int (^MySum)(int, int) = ^(i

黑马程序员--oc基础第八篇

八. oc基础知识(Protocal) protocal 出发点:他仅仅是用来声明方法的. 1. 可以用来声明一大堆方法(但是不能声明成员变量) 2. 只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明 3. 只要父类遵守了某个协议,就相当于子类也遵守了 4. 协议列出了一组方法,有些是必须实现的,有些是选择实现(@optional).遵守协议就要实现协议里面所有必须实现的方法.         1. 定义一个协议 协议格式的编写 @protocol协议名称//为协议起一个有意义的名

黑马程序员--oc基础第十篇(foundation框架下、集合)

十 . oc基础(Foundation框架下) 1.下面介绍几种OC对象类型的存储结构:NSArray,NSDictionary,NSSet,以及基本数据类型封装类. NSNumber:*既然这几种数据结构都是用来存放对象类型的那么基本数据类型想要放入其中就要先对他们进行封装.使用NSNumber对基本数据类型进行封装. // // Created by keeganlee on 15/3/2. // Copyright (c) 2015年 keeganlee. All rights reser

黑马程序员--oc基础第六篇

六. oc基础知识(内存管理下) 总结:内存管理代码规范 1.只要调用alloc那么就必须调用release: 2.set方法的代码部分 *基本数据类型直接赋值. *如果是oc对象类型 - (void) setCar:(Car *)car { if(_car!=car) { [_car release]; _car=[Car retain]; } } 3.dealloc 部分的代码规范 *一定要[super dealloc ]放在最后面. *对self(当前)所拥有的其他对象做一次release

黑马程序员--oc基础第九篇(Foundation框架上)

九 . oc基础(Foundation框架上) 1.四中结构体类型:NSRange,NSPoint,NSSize,NSRect 1>NSRange:是一个以为的结构由成员location和成员length共同组成. *NSRange的创建方式:NSRange range=NSMakeRange(2.4),代表范围是从2开始一直到5,location为2,length为4 *NSString *[email protected]“I love you”:NSRange range=[str ran

黑马程序员---OC基础9【Foundation框架】【NSString介绍】【NSURL读写字符串】【NSString字符串比较】【NSString前后缀检查及搜索】【NSRange使用】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [Foundation框架] 1.Foundation框架介绍 1)Foundation框架概念 框架是由许多类.方法.函数.文档按照一定的逻辑组织起来的集合 以便使研发程序变得 更容易在OS X下的Mac操作系统中大约有80个框架为所有程序开发奠定基础的框架称为Foundation 框架 2)Foundation框架的作用 Foundation框架是Mac\iOS中其他框架的基础 Foundat

黑马程序员_OC中的block和protocol

一.block block和指向函数的指针比较相似. 1.定义block变量 #import <Foundation/Foundation.h>   int main(int argc, const char * argv[]) {     //定义block变量,没有返回值类型,也没有形式参数     void (^myBlock)();         //给block变量赋值     myBlock=^{         NSLog(@"----------");  

黑马程序员_ Objective-c 之block、protocol学习笔记

一):block学习总结 block :用来保存一段代码. 1.block 特点:  1> Block封装了一段代码,可以在任何时候执行   2> Block可以作为函数或者函数的返回值,而其本身又可以带输入参数或返回值  3> 苹果官方建议尽量多用block,在多线程.异步任务.集合遍历.集合排序.动画转场用的很多  4> Block可以在程序运行时凭空产生一个代码保存起来  2.block的标志:^  3.block跟函数很像 1> 可以保存代码  2> 有返回值 

黑马程序员---OC基础5【点语法】【@property关键字】【@synthesize关键字】【id类型】【动态类型】【构造方法】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- [点语法] 1 1.使用“点语法” 2 Student *stu= [[Student alloc]init]; 3         //调用set方法 4         [stu setAge:20]; 5         [stu setName:@"Jone"]; 6         //点语法:xcode的特性,Xcode帮我们做了代码替换 7         //点语法,