Objective-C知识总结(5)
block的基本使用
1 // 有参有返回值 2 /* 3 格式: 4 返回值类型 (^变量名)(参数类型及个数) = ^(形参列表){ 5 6 代码块语句; 7 8 return ; 9 10 }; 11 12 */ 13 // 定义一个有参数\有返回值的block 14 int (^myblock1)(int ,int) = ^(int x,int y){ 15 16 return x+y; 17 18 }; 19 20 int sum = myblock1(10,20); 21 NSLog(@"sum = %d",sum); 22 23 // 给变量重新赋值 24 myblock1 =^(int x,int y){ 25 26 return x*y; 27 28 }; 29 30 // 使用block,接收返回值 31 sum = myblock1(10,20); 32 NSLog(@"sum = %d",sum); 33 34 // 有参无返回值 35 36 /* 37 格式: 38 void (^变量名)(参数类型及个数) = ^(形参列表){ 39 40 代码块语句; 41 42 }; 43 44 */ 45 // 定义一个变量myblock2 同时进行赋值 46 void (^myblock2)(int ,int )=^(int a,int b){ 47 48 NSLog(@"a + b = %d",a+b); 49 50 }; 51 52 myblock2(34,12); 53 54 // 先定义变量,再赋值 55 myblock2 = ^(int x,int y){ 56 57 int m = x>y?x:y; 58 NSLog(@"max = %d",m); 59 60 }; 61 myblock2(34,12); 62 63 // 无参无返回值 block 64 65 /* 66 //定义一个没有参数\没有返回值的block变量,并且赋值了 67 void (^block变量名)() = ^(){ 68 69 代码块的语句; 70 }; 71 72 优化: 73 void (^block变量名)() = ^{ 74 75 代码块的语句; 76 }; 77 78 //block变量的使用 79 block变量名(); 80 81 */ 82 83 void (^myBlock4)()=^{ 84 85 NSLog(@"xxxx"); 86 printf("xxxxxx"); 87 88 }; 89 90 //使用block变量 91 myBlock4();
block的typedef
typedef int (^myBlock)(int,int);myBlock a = ^(int x, int y){return x + y;};int c = a(1,2);
block访问外部变量
1 int main(int argc, const char * argv[]) { 2 @autoreleasepool { 3 int m = 10; 4 5 NSLog(@"1:m = %d",m); // 10 6 NSLog(@"2:m addr = %p",&m); // 栈区 7 // NSString *str = @"abc"; 8 // NSLog(@"str = %p",str); 9 10 // 定义变量,并且赋值 11 // 当定义block的时候,block会把外部变量以const的方式复制一份 12 // 存放到block的所在的内存中 13 void (^myBlock)()=^{ 14 // m的值不能被修改 15 // m = 100; 16 17 NSLog(@"5:m addr = %p",&m); // 堆区 18 // 可以访问m的值 19 NSLog(@"3:in block m = %d",m); // 10 20 21 }; 22 23 NSLog(@"4:m addr = %p",&m); // 栈区 24 // 使用 25 myBlock(); 26 } 27 return 0; 28 }
打印结果为
// 全局变量存在于数据段 int n=0; int main(int argc, const char * argv[]) {@autoreleasepool {__block int m = 10;NSLog(@"1:m add = %p",&m); // 栈区地址NSLog(@"2:m = %d",m);n = 10;NSLog(@"7:n add = %p",&n); // 数据段NSLog(@"8:n = %d",n); // 10// 静态变量static int a = 33;NSLog(@"----------%p", &a); // 数据段// __block 不在以const的方式拷贝void (^myBlock)()=^{int x = 100; // 栈区// m的值可以被修改m = 100;// 全局变量可以修改n = 100;// 静态变量可以修改a = 10;NSLog(@"4:m addr = %p",&m); // 堆区// 可以访问m的值NSLog(@"3:in block m = %d",m); // 100 NSLog(@"9:n add = %p",&n); // 数据段NSLog(@"10:n = %d",n); // 100 };myBlock();NSLog(@"5:m = %d",m); // 100NSLog(@"6:m addr = %p",&m); // 堆区 NSLog(@"11:n add = %p",&n); // 数据段NSLog(@"12:n = %d",n); // 100 }return 0; }
打印结果为
block使用注意
静态变量 和 全局变量 在加不加 __block都会直接引用变量地址。也就意味着 可以改变修改变量的值,在没有加__block参数的情况下
全局block:定义在函数外面的block是global(全体的)的 另外如果在函数内部的block,没有捕获任何自动变量,那么它也是全局的
栈block:区别为是否引用了外部变量
堆block:是对栈block copy得来。对全局block copy 不会有任何作用,返回的仍然是全局block
block作为函数的返回值
// 定义了一个新的类型 newType2 typedef int(^myBlock)(int ,int ); myBlock test(){// 返回block类型return ^(int a,int b){return a+b;};}int main() {myBlock n = test();int a = n(1,2);NSLog(@"a = %d", a); // 3 }
block助记符 inlineblock
block 也可以这么定义
// 可以加上形参int (^block)(int x,int y) = ^(int x, int y){return x + y;};
协议 Protocol
什么是协议?
一些方法的声明,一般写到一个.h的头文件中
方法有两种: 1) 必须实现 2) 选择实现
协议的作用:
供其他的类去遵守,如果一个类遵守了一个协议,就应该实现这个协议中定义的必须要实现的方法
协议的写法
@protocol xxxx <NSObject> // 必须实现的方法(默认) @required // 可选实现的方法 @optional@end
遵守协议的步骤: 1) 导入 头文件 2) 遵守协议 3) 实现方法
protocol类型限制
第一种类型限制:给id类型增加限制
id<xxxxxxx> obj;
增加<xxxxxxx>以后,表示,obj只能赋值遵守了xxxxxxx协议的对象
id<xxxxxxx> obj = d;
第二种类型限制:
表示,obj2赋值的时候,必须是Girl对象,并其遵守 了 xxxxxxx协议.
Girl *mm = [Girl new];
Girl<xxxxxxx> *obj2 = mm;
protocol代理设计模式
请看我之前的博客 >---请点击这里---<
------------------------------------------------------------------------------------------------------------------------------------------------------------
其他四篇链家如下:
Objective-C知识总结(1)
Objective-C知识总结(2)
Objective-C知识总结(3)
Objective-C知识总结(4)
转载于:https://www.cnblogs.com/melodyzhy/p/4684559.html
Objective-C知识总结(5)相关推荐
- 网络爬虫学习(三)-scrapy框架
目录 一 Scrapy框架简介 二 scrapy框架的基本使用 1) 环境的安装 2)基础命令 3)项目组成: 4)创建爬虫文件: 5)scrapy架构组成 6) 五大核心组件 7)srapy工作 ...
- 知识图谱实体链接是什么?一份“由浅入深”的综述
作者 | 尼古拉·瓦砾 来源 | Paperweekly(ID:paperweekly) [导读]这个世界充斥着无数的结构化数据(wiki)和非结构化数据(web),然而,如何将两者有效地集成仍然是个 ...
- 《预训练周刊》第35期:零样本规划器的语言模型:为智能体提取可操作的知识、LaMDA:对话应用的语言模型...
No.35 智源社区 预训练组 预 训 练 研究 观点 资源 活动 关于周刊 本期周刊,我们选择了13篇预训练相关的论文,涉及动作规划.大模型改进.网络结构.零样本学习.对话模型.视频理解.机器翻译. ...
- iOS和android运存机制,为什么苹果4GB运存却比安卓8GB更丝滑流畅?看完立马涨知识了...
众所周知,目前智能手机分为苹果和安卓两大阵营.如今不管是苹果手机还是安卓手机在性能方面都越来越强大,为了进一步提升用户体验,安卓主流旗舰标配已达到了8G运存,顶配甚至达到了12G,最低也是4G起步,反 ...
- C语言程序设计做题笔记之C语言基础知识(下)
C 语言是一种功能强大.简洁的计算机语言,通过它可以编写程序,指挥计算机完成指定的任务.我们可以利用C语言创建程序(即一组指令),并让计算机依指令行 事.并且C是相当灵活的,用于执行计算机程序能完成的 ...
- 用计算机语言编写的完成一定功能,C+的+预备知识.ppt
C的预备知识 * (顺序语句.选择语句.循环语句FOR及嵌套) C++讲义 预知识:程序设计.算法和C++ 第一章:顺序结构 1.1标准数据类型和变量的定义 1.2 运算符.标准函数和表达式 1.4基 ...
- Paper:《A Few Useful Things to Know About Machine Learning—关于机器学习的一些有用的知识》翻译与解读
Paper:<A Few Useful Things to Know About Machine Learning-关于机器学习的一些有用的知识>翻译与解读 目录 <A Fe ...
- (d2l-ai/d2l-zh)《动手学深度学习》pytorch 笔记(2)前言(介绍各种机器学习问题)以及数据操作预备知识Ⅰ
开源项目地址:d2l-ai/d2l-zh 教材官网:https://zh.d2l.ai/ 书介绍:https://zh-v2.d2l.ai/ 笔记基于2021年7月26日发布的版本,书及代码下载地址在 ...
- Deep learning:一(基础知识_1)
前言: 最近打算稍微系统的学习下deep learing的一些理论知识,打算采用Andrew Ng的网页教程UFLDL Tutorial,据说这个教程写得浅显易懂,也不太长.不过在这这之前还是复习下m ...
- EMNLP 2021 最新综述:语言模型中的关系性知识
©作者 | 张义策 单位 | 北哈尔滨工业大学(深圳) 研究方向 | 自然语言处理 论文标题: Relational World Knowledge Representation in Context ...
最新文章
- hdu3966 树链剖分点权模板+线段树区间更新/树状数组区间更新单点查询
- bash shell while语法
- 迅雷2012校园招聘笔试题
- C#语句——循环语句(for循环与for循环嵌套)
- 在ubuntu上搭建开发环境9---Ubuntu删除ibus出现的问题及解决
- 作者:卢祥虎,男,北京金信网银金融信息服务有限公司机器学习算法工程师。...
- python实现pdf解密和pdf转图片
- 大连理工大学在CVPR18大规模精细粒度物种识别竞赛中获得冠军
- Discuz 论坛实现qq小程序
- 2018 牛客多校 2
- 云时代的开源,必须了解的7件事
- 微软私有云部署及讲解专题
- 四城市十行业紧缺人才信息公布
- 我今天人品大爆发啊,赚了299美元
- 中国电信无线网服务器,如何使用路由器共享电信天翼无线网络?
- Word题注无法自动更新(删除其他题注后)
- 医学图像分割评判标准及程序代码
- 计算机应用基础有必要学吗,计算机应用基础教学革新的必要性
- 如何通过低代码开发平台实现CRM客户关系管理系统
- 【STM32H7教程】第85章 STM32H7的SPI 总线应用之SPI Flash的STM32CubeProg下载算法制作
热门文章
- Java的日期API真烂
- ubuntu 下安装java6的源
- everytime you write on a whiteboard
- find a group of people who want to do similar things with you
- Js代码执行 变量的值 运算 变量提升
- 项目管理纵横谈(1)──项目的管理的目标
- 1355: [Baltic2009]Radio Transmission
- Clinicast让癌症治疗不那么昂贵
- ios-NSMutableAttributedString 更改文本字符串颜色、大小
- [NOIP1999] 普及组