文档章节

OC语言-Block与协议

盘盘的灰灰
 盘盘的灰灰
发布于 2016/08/08 15:14
字数 1477
阅读 6
收藏 0
点赞 0
评论 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

Swift实现代理,通知,闭包传值

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

ufo00001 ⋅ 2017/08/14 ⋅ 0

JavaScript & Objective-C二重奏

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

魔笛GNR ⋅ 2016/10/19 ⋅ 0

OC中copy的使用

首先,什么是copy? Copy的字面意思是“复制”、“拷贝”,是一个产生副本的过程。 常见的复制有:文件复制,作用是利用一个源文件产生一个副本文件。 特点:1、修改源文件的内容,不会影响副...

傲风凌寒 ⋅ 2014/05/19 ⋅ 1

swift的数据类型到底是什么尿性 (说点别人没讲明白的)

文初: 如果你对swift的些许了解只局限在 swift中的类型使用struct取代class 多了Optional可选类型 这些最基础的认知,而对其底层设计的原因和原理了解甚少,那这篇文章会给你新的视角,让你...

CoderDancer ⋅ 2017/08/22 ⋅ 0

(一)Block的实质初探

相关文章 (一)Block的实质初探 (二)Block之存储域 NSConcreteStackBlock,NSConcreteGlobalBlock,NSConcreteMallocBlock (三)Block之截获变量和对象 (四)Block之 _block修饰符及其存...

madaoCN ⋅ 2017/10/21 ⋅ 0

iOS进阶补完计划-WebViewJavascriptBridge实现原理

提及其原理、所有用过它的童鞋都会说他在js和Native(原生)之间搭建了一个桥梁。通过这个桥、使他们相互通信。但具体怎么通信呢?这个桥如何工作?十有八九说却不清。 JSBridge的逻辑简而言...

kirito_song ⋅ 2017/12/19 ⋅ 0

对于Objective-C运行时,我的一些理解

运行时到底是什么,我也不是特别的明白,我说不清完整的定义,所以只能说说自己对于OC运行时的简单理解了。我们在点击Xcode的Run按钮的时候,其实内部发生了很多的事情,也就是编译的过程,简...

召唤攻城狮 ⋅ 2014/04/08 ⋅ 1

Object-C 一些关键字的理解 @synchronized、__block、class等。。。

@synchronized 当 Objective-C 中有两个线程同时修改同一个对象。为了防止多个线程同时执行同一个代码块,OC 提供了@synchronized() 指令。 使用 @synchronized() 指令可以锁住在线程中执行的...

Jack088 ⋅ 2015/12/22 ⋅ 0

JS与OC-WebView交互总结

OC与JS交互有两种方式,WKWebView和UIWebView,由于UIWebView比较耗内存,性能上不太好,所以苹果在iOS 8中推出了WKWebView。 一、与UIWebView交互 在UIWebView与JS交互中最简单的办法就是拦截...

乔兰伊雪 ⋅ 05/29 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaScript零基础入门——(十一)JavaScript的DOM操作

JavaScript零基础入门——(十一)JavaScript的DOM操作 大家好,欢迎回到我们的JavaScript零基础入门。最近有些同学问我说,我讲的的比书上的精简不少。其实呢,我主要讲的是我在开发中经常会...

JandenMa ⋅ 17分钟前 ⋅ 0

volatile和synchronized的区别

volatile和synchronized的区别 在讲这个之前需要先了解下JMM(Java memory Model :java内存模型):并发过程中如何处理可见性、原子性、有序性的问题--建立JMM模型 详情请看:https://baike.b...

MarinJ_Shao ⋅ 43分钟前 ⋅ 0

深入分析Kubernetes Critical Pod(一)

Author: xidianwangtao@gmail.com 摘要:大家在部署Kubernetes集群AddOn组件的时候,经常会看到Annotation scheduler.alpha.kubernetes.io/critical-pod"="",以表示这是一个关键服务,那你知...

WaltonWang ⋅ 51分钟前 ⋅ 0

原子性 - synchronized关键词

原子性概念 原子性提供了程序的互斥操作,同一时刻只能有一个线程能对某块代码进行操作。 原子性的实现方式 在jdk中,原子性的实现方式主要分为: synchronized:关键词,它依赖于JVM,保证了同...

dotleo ⋅ 57分钟前 ⋅ 0

【2018.06.22学习笔记】【linux高级知识 14.4-15.3】

14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp

lgsxp ⋅ 今天 ⋅ 0

JeeSite 4.0 功能权限管理基础(Shiro)

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。 只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户...

ThinkGem ⋅ 昨天 ⋅ 0

python f-string 字符串格式化

主要内容 从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在本文的最后,您将了解如何以及为什么今...

阿豪boy ⋅ 昨天 ⋅ 0

Python实现自动登录站点

如果我们想要实现自动登录,那么我们就需要能够驱动浏览器(比如谷歌浏览器)来实现操作,ChromeDriver 刚好能够帮助我们这一点(非谷歌浏览器的驱动有所不同)。 一、确认软件版本 首先我们...

blackfoxya ⋅ 昨天 ⋅ 0

线性回归原理和实现基本认识

一:介绍 定义:线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。为了了解这个定义,我们先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商...

wangxuwei ⋅ 昨天 ⋅ 0

容器之查看minikue的environment——minikube的环境信息

执行如下命令 mjduan@mjduandeMacBook-Pro:~/Docker % minikube docker-envexport DOCKER_TLS_VERIFY="1"export DOCKER_HOST="tcp://192.168.99.100:2376"export DOCKER_CERT_PATH="/U......

汉斯-冯-拉特 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部