文档章节

OC语言-Block与协议

盘盘的灰灰
 盘盘的灰灰
发布于 2016/08/08 15:14
字数 1477
阅读 6
收藏 0
  • 延展: Extension

         1). 是1个特殊的分类. 所以延展也是类的一部分.

         2). 特殊之处:

             a. 延展这个特殊的分类没有名字.

             b. 只有声明没有实现.和本类共享1个实现.

  • 延展100%的情况下不会独占1个文件. 都是将延展直接写在本类的实现文件中.

             这个时候,写在延展中的成员,就相当于是这个类的私有成员.只能在本类的实现中访问.

             外部不能访问.

     

  • block变量的声明  

         1). 虽然block变量中是用来存储1段代码的.但是1个block变量中并不是任意的1段代码都可以存进去的

     
  • 声明block变量的语法格式:       

             返回值类型 (^block变量的名称)(参数列表);

             void (^myBlock1)(); 表示声明了1个block类型的变量叫做myBlock1 这个变量中只能存储没有返回值没有参数的代码段.

             int (^myBlock2)(); 

             int (^myBlock3)(int num1,int num2);

     
  • 初始化block变量

         1). 原理: 写1个符合block要求的代码段.存储到block变量中就可以了.    

         2). 代码段的书写格式:

             ^返回值类型(参数列表){

                代码段;

             };

         3). 写1个无参数无返回值的代码段.

             ^void(){

                NSLog(@"我爱你");

                NSLog(@"我恨你");

             };

             这个时候,我们就可以将这段代码使用赋值符号存储到 无返回值无参数要求的block变量中.

             void (^myBlock1)();

             myBlock1 =  ^void(){

                 NSLog(@"我爱你");

                 NSLog(@"我恨你");

             };

             当然也可以在声明block变量的同时使用符合要求的代码段初始化. 

             void (^myBlock1)() =  ^void(){

                 NSLog(@"我爱你");

                 NSLog(@"我恨你");

             };      

         4). 有返回值的代码段.

             ^int(){

                int num1 = 10 + 20;

                return num1;

             };        

             我们就可以将这段代码赋值给符合要求的block变量.

             int (^myBlock2)() =  ^int(){

                 int num1 = 10 + 20;

                 return num1;

             };

         5). 既有参数既有返回值的代码段.

             ^int(int num1,int num2){

                int num3= num1 + num2;

                return num3;

             };      

             所以 我们可以将这个代码赋值给符合要求的block变量.

             int (^myBlock3)(int num1,int num2) =  ^int(int num1,int num2){

                 int num3= num1 + num2;

                 return num3;

             };

     

     
  • 关于block的简写.

         1). 如果我们写的代码段没有返回值.那么代码段的void可以省略.

             void (^myBlock1)() =  ^(){

                 NSLog(@"我爱你");

                 NSLog(@"我恨你");

             };

             注意,我说的是代码段的返回值如果是void可以省略,声明block变量的返回值无论是什么不可以省略.

         2). 如果我们写的代码段没有参数,那么代码段的小括弧写可以省略.

             int (^myBlock2)() =  ^int{

                 int num1 = 10 + 20;

                 return num1;

             };

             再次强调: 我们说的是代码段.

             所以,当1个代码段既没有参数,也没有返回值的适合,就只写^

             void (^myBlock1)() =  ^{

                 NSLog(@"我爱你");

                 NSLog(@"我恨你");

             };         

         3).声明block变量的时候.如果有指定参数.可以只写参数的类型而不写参数的名称;

         int (^myBlock3)(int,int) =  ^int(int num1,int num2){

             int num3= num1 + num2;

             return num3;

         };

         注意: 这个地方我们说的是声明block变量的时候 再写代码段的时候 类型和名称都要写.

         4).无论代码段是否有返回值.在写代码的时候.可以不写返回值类型 省略.

            如果在写代码段的时候,省略了返回值,这个时候系统会自动的确定返回值的类型.

            如果代码段中没有返回任何数据 那么它会认为这个代码段是没有返回值的.

            如果代码中有返回数据 返回的数据是什么类型 它就会认为这个代码段是什么类型的.

        建议: 仍然按照我们最标准的写法来写block变量和block代码段.因为这样可以提高代码的阅读性.

     
  •  关于block块访问外部变量的问题.

         1). 在block代码块的内部可以取定义在外部的变量的值, 定义在外部的局部变量和全局变量.

         2). 在block代码块的内部可以修改全局变量的值.但是不能修改定义在外部的局部变量的值.

         3). 如果你希望我们定义的局部变量可以允许在block代码的内部去修改,那么就为这个局部变量加1个__block的修饰符.

     
  •   typedef 返回值类型 (^新类型)(参数列表); 

             typedef void (^NewType)(); 代表重新定义了1个类型叫做NewType 是1个block类型 无参数无返回值的block类型

  • 协议的声明.

         @protocol 协议名称 <NSObject>

         方法的声明;

         @end

    在协议中,只能用来声明方法,协议的作用:就是专门用来写方法声明的. 
  • 类是单继承. 但是协议可以多遵守.

         1个类只能有1个父类

         但是1个类可以同时遵守多个个协议.

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

         @end

        当1个类遵守了多个协议之后,就相当于这个类拥有了所有协议中定义的方法的声明.

         那么这个类,就应该实现所有协议中的方法.     

         如果不实现,其实也不会报错.编译器只是会报警告.

         但是当创建对象,来调用这个没有实现的协议中的方法的时候,就会报错.

     
  •  在协议中,如果方法的声明被@required修饰,那么遵守这个协议的类必须要实现这个方法,否则编译器会发出警告.

         在协议中,如果方法的声明被@optional修饰,那么遵守这个协议的类如果不实现这个方法.编译器也不会报警告.

  • NSObject<协议名称> *指针名;

          这个时候,这个指针可以指向遵守了指定协议的任意对象. 否则就会报1个警告.

          NSObject<StudyProtocol> *obj = [Student new];

     

 

© 著作权归作者所有

共有 人打赏支持
盘盘的灰灰
粉丝 0
博文 31
码字总数 24142
作品 0
深圳
OC语言自学《十二》---- OC(block、@property)

一、block 如何定义block变量 int (^sumblock)(int,int) 如何利用block封装代码 //有参数,无返回值^(int a, int b){ }; //没有参数,没有返回值 ^{ } block访问外部变量 block内部可以访问外...

罗眯眯
2014/04/08
0
0
Swift编程权威指南第2版 读后收获

  自从参加工作一直在用OC做iOS开发。在2015年的时候苹果刚推出swift1.0不久,当时毕竟是新推出的语言,大家也都很有激情的学习。不过在学完后发现很难在实际项目中使用,再加上当时公司项...

滴水微澜
08/14
0
0
从 OC 到 Swift 的快速入门与专业实践

只会介绍与 OC 有明显区别的地方,不会介绍 OC 中没有的,比如元组。当前总结也只是蜻蜓点水而已,但是有 OC 的基础,看这些已经足够。 一、数据 Swift 是类型安全的语言: Swift 必须明确数...

CoderHG
08/04
0
0
Swift实现代理,通知,闭包传值

1.区别 原文链接,著作权归作者所有,侵权删 第一就是代理,这也是很常用的方式,特点是一对一的形式,而且逻辑结构非常清晰。实现起来较为简单:写协议 ,设置代理这个属性, 最好在你想通知代...

ufo00001
2017/08/14
0
0
JavaScript & Objective-C二重奏

一、JS call OC 方法1: 通拦截协议头来获取协议字符串。在UIWebView中的代理方法中有这样的方法,如下图所示: 下面是我写的简单的H5页面通过JS请求一个自定义协议的URL,然后通过UIWebView...

魔笛GNR
2016/10/19
19
0

没有更多内容

加载失败,请刷新页面

加载更多

20180920 rzsz传输文件、用户和用户组相关配置文件与管理

利用rz、sz实现Linux与Windows互传文件 [root@centos01 ~]# yum install -y lrzsz # 安装工具sz test.txt # 弹出对话框,传递到选择的路径下rz # 回车后,会从对话框中选择对应的文件传递...

野雪球
今天
2
0
OSChina 周四乱弹 —— 毒蛇当辣条

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ 达尔文:分享花澤香菜/前野智昭/小野大輔/井上喜久子的单曲《ミッション! 健?康?第?イチ》 《ミッション! 健?康?第?イチ》- 花澤香菜/前野智...

小小编辑
今天
8
3
java -jar运行内存设置

java -Xms64m #JVM启动时的初始堆大小 -Xmx128m #最大堆大小 -Xmn64m #年轻代的大小,其余的空间是老年代 -XX:MaxMetaspaceSize=128m # -XX:CompressedClassSpaceSize=6...

李玉长
今天
4
0
Spring | 手把手教你SSM最优雅的整合方式

HEY 本节主要内容为:基于Spring从0到1搭建一个web工程,适合初学者,Java初级开发者。欢迎与我交流。 MODULE 新建一个Maven工程。 不论你是什么工具,选这个就可以了,然后next,直至finis...

冯文议
今天
2
0
RxJS的另外四种实现方式(四)——性能最高的库(续)

接上一篇RxJS的另外四种实现方式(三)——性能最高的库 上一篇文章我展示了这个最高性能库的实现方法。下面我介绍一下这个性能提升的秘密。 首先,为了弄清楚Most库究竟为何如此快,我必须借...

一个灰
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部