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)相关推荐

  1. 网络爬虫学习(三)-scrapy框架

    目录 一  Scrapy框架简介 二  scrapy框架的基本使用 1) 环境的安装 2)基础命令 3)项目组成: 4)创建爬虫文件: 5)scrapy架构组成 6) 五大核心组件 7)srapy工作 ...

  2. 知识图谱实体链接是什么?一份“由浅入深”的综述

    作者 | 尼古拉·瓦砾 来源 | Paperweekly(ID:paperweekly) [导读]这个世界充斥着无数的结构化数据(wiki)和非结构化数据(web),然而,如何将两者有效地集成仍然是个 ...

  3. 《预训练周刊》第35期:零样本规划器的语言模型:为智能体提取可操作的知识、LaMDA:对话应用的语言模型...

    No.35 智源社区 预训练组 预 训 练 研究 观点 资源 活动 关于周刊 本期周刊,我们选择了13篇预训练相关的论文,涉及动作规划.大模型改进.网络结构.零样本学习.对话模型.视频理解.机器翻译. ...

  4. iOS和android运存机制,为什么苹果4GB运存却比安卓8GB更丝滑流畅?看完立马涨知识了...

    众所周知,目前智能手机分为苹果和安卓两大阵营.如今不管是苹果手机还是安卓手机在性能方面都越来越强大,为了进一步提升用户体验,安卓主流旗舰标配已达到了8G运存,顶配甚至达到了12G,最低也是4G起步,反 ...

  5. C语言程序设计做题笔记之C语言基础知识(下)

    C 语言是一种功能强大.简洁的计算机语言,通过它可以编写程序,指挥计算机完成指定的任务.我们可以利用C语言创建程序(即一组指令),并让计算机依指令行 事.并且C是相当灵活的,用于执行计算机程序能完成的 ...

  6. 用计算机语言编写的完成一定功能,C+的+预备知识.ppt

    C的预备知识 * (顺序语句.选择语句.循环语句FOR及嵌套) C++讲义 预知识:程序设计.算法和C++ 第一章:顺序结构 1.1标准数据类型和变量的定义 1.2 运算符.标准函数和表达式 1.4基 ...

  7. Paper:《A Few Useful Things to Know About Machine Learning—关于机器学习的一些有用的知识》翻译与解读

    Paper:<A Few Useful  Things to  Know About  Machine  Learning-关于机器学习的一些有用的知识>翻译与解读 目录 <A Fe ...

  8. (d2l-ai/d2l-zh)《动手学深度学习》pytorch 笔记(2)前言(介绍各种机器学习问题)以及数据操作预备知识Ⅰ

    开源项目地址:d2l-ai/d2l-zh 教材官网:https://zh.d2l.ai/ 书介绍:https://zh-v2.d2l.ai/ 笔记基于2021年7月26日发布的版本,书及代码下载地址在 ...

  9. Deep learning:一(基础知识_1)

    前言: 最近打算稍微系统的学习下deep learing的一些理论知识,打算采用Andrew Ng的网页教程UFLDL Tutorial,据说这个教程写得浅显易懂,也不太长.不过在这这之前还是复习下m ...

  10. ​EMNLP 2021 最新综述:语言模型中的关系性知识

    ©作者 | 张义策 单位 | 北哈尔滨工业大学(深圳) 研究方向 | 自然语言处理 论文标题: Relational World Knowledge Representation in Context ...

最新文章

  1. hdu3966 树链剖分点权模板+线段树区间更新/树状数组区间更新单点查询
  2. bash shell while语法
  3. 迅雷2012校园招聘笔试题
  4. C#语句——循环语句(for循环与for循环嵌套)
  5. 在ubuntu上搭建开发环境9---Ubuntu删除ibus出现的问题及解决
  6. 作者:卢祥虎,男,北京金信网银金融信息服务有限公司机器学习算法工程师。...
  7. python实现pdf解密和pdf转图片
  8. 大连理工大学在CVPR18大规模精细粒度物种识别竞赛中获得冠军
  9. Discuz 论坛实现qq小程序
  10. 2018 牛客多校 2
  11. 云时代的开源,必须了解的7件事
  12. 微软私有云部署及讲解专题
  13. 四城市十行业紧缺人才信息公布
  14. 我今天人品大爆发啊,赚了299美元
  15. 中国电信无线网服务器,如何使用路由器共享电信天翼无线网络?
  16. Word题注无法自动更新(删除其他题注后)
  17. 医学图像分割评判标准及程序代码
  18. 计算机应用基础有必要学吗,计算机应用基础教学革新的必要性
  19. 如何通过低代码开发平台实现CRM客户关系管理系统
  20. 【STM32H7教程】第85章 STM32H7的SPI 总线应用之SPI Flash的STM32CubeProg下载算法制作

热门文章

  1. Java的日期API真烂
  2. ubuntu 下安装java6的源
  3. everytime you write on a whiteboard
  4. find a group of people who want to do similar things with you
  5. Js代码执行 变量的值 运算 变量提升
  6. 项目管理纵横谈(1)──项目的管理的目标
  7. 1355: [Baltic2009]Radio Transmission
  8. Clinicast让癌症治疗不那么昂贵
  9. ios-NSMutableAttributedString 更改文本字符串颜色、大小
  10. [NOIP1999] 普及组