文档章节

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
深圳
私信 提问
iOS开发之OC与swift开发混编教程,代理的相互调用,block的实现。OC调用Swift中的代理, OC调用Swift中的Block 闭包

本文章将从两个方向分别介绍 OC 与 swift 混编 1. 第一个方向从 swift工程 中引入 oc类   1. 1 如何在swift的类中使用oc类 1.2 如何在swift中实现oc的代理方法 1.3 如何在swift中实现oc的B...

鸿鹄当高远
11/06
0
0
OC语言自学《十二》---- OC(block、@property)

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

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

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

ufo00001
2017/08/14
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

没有更多内容

加载失败,请刷新页面

加载更多

自定义 Maven 的 repositories

有时,应用中需要一些比较新的依赖,而这些依赖并没有正式发布,还是处于milestone或者是snapshot阶段,并不能从中央仓库或者镜像站上下载到。此时,就需要 自定义Maven的<repositories>。 ...

waylau
17分钟前
1
0
徒手写一个es6代码库

mkdir democd demonpm initnpm install -g babelnpm install -g babel-clinpm install --save-dev babel-preset-es2015-node5 在项目目录创建两个文件夹 functional-playground ......

lilugirl
17分钟前
1
0
linux定位应用问题的一些常用命令,特别针对内存和线程分析的dump命令

1.jps找出进程号,找到对应的进程号后面才好继续操作 2.linux查看进程详细信息 ps -ef | grep 进程ID 3. dump内存信息 Jmap -dump:format=b,file=YYMMddhhmm.dump pid 4.top查看cpu占用信息 ...

noob_chr
17分钟前
1
0
Android TV开发-按键焦点

写在前面 按键焦点过程了解 2.1 dispatchKeyEvent 过程了解 2.2 焦点查找请求过程了解 1.2.1 第一次获取焦点 1.2.3 按键焦点 焦点控制 焦点记忆 应用场景 参考资料 [TOC] 1. 写在前面 工...

冰雪情缘l
17分钟前
1
0
java框架学习日志-3

这章主要是补充一些ioc创建对象的方式,ioc容器在写好<bean></bean>的时候就已经创建对象了。在之前的例子中,一直都是无参的构造方法。下面给出有参的构造方法的对象的创建,没有什么难点重...

白话
20分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部