码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-10-07 20:14:55      阅读:261      评论:0      收藏:0      [点我收藏+]

标签:

------- 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.解耦,不再依赖于某个具体的类型,任何类型都可以, 只要遵守了协议。

 

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

标签:

原文地址:http://www.cnblogs.com/snowimba/p/4859244.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!