//
// main.m
// Block的应用场景
// typedef void (^workBlock)(); #import <Foundation/Foundation.h>
/* void goToWorkPrefix()
{
NSLog(@"起床");
NSLog(@"穿衣服");
NSLog(@"洗漱");
NSLog(@"喝早茶");
NSLog(@"驾车去上班");
} void goToWorkSubfix()
{
NSLog(@"收拾东西");
NSLog(@"驾车回家");
NSLog(@"吃晚饭");
NSLog(@"洗澡");
NSLog(@"睡觉");
} void goToWorkInday1()
{
goToWorkPrefix(); NSLog(@"认识新同事"); goToWorkSubfix();
} void goToWorkInday2()
{
goToWorkPrefix(); NSLog(@"熟悉公司代码"); goToWorkSubfix();
} void goToWorkInday3()
{
goToWorkPrefix(); NSLog(@"开始编写代码"); goToWorkSubfix();
} void goToWorkInday4()
{
goToWorkPrefix(); NSLog(@"应用程序上架"); goToWorkSubfix();
} */ // 当发现代码的前面和后面都是一样的时候, 这个时候就可以使用block void goToWork(workBlock w)
{
NSLog(@"起床");
NSLog(@"穿衣服");
NSLog(@"洗漱");
NSLog(@"喝早茶");
NSLog(@"驾车去上班"); // 不一样
w(); NSLog(@"收拾东西");
NSLog(@"驾车回家");
NSLog(@"吃晚饭");
NSLog(@"洗澡");
NSLog(@"睡觉");
} void goToWorkInDay1()
{
goToWork( ^{NSLog(@"认识新同事");} );
}
void goToWorkInDay2()
{
goToWork(^{
NSLog(@"熟悉公司代码");
});
}
void goToWorkInDay3()
{
goToWork(^{
NSLog(@"开始编写代码");
});
}
void goToWorkInDay4()
{
goToWork(^{
NSLog(@"应用程序上架");
});
} /*
找到需要读取的文件
读取文件 操作文件 关闭文件
*/ int main(int argc, const char * argv[]) { goToWorkInDay2();
return ;
}
//  main.m
// Block的注意事项
// 终端进入main.m的目录,执行cc -rewrite-objc main.m ,能够在"磁盘"中看到m文件执行后的C++文件。 #import <Foundation/Foundation.h>
#import "Person.h" int main(int argc, const char * argv[]) { // 1.block中可以访问外面的变量
int a = ;
void (^myBlock)() = ^{
NSLog(@"a = %i", a);
};
myBlock(); int a1=;
void( ^myBlock1)()=^{
Nslog(@"a= %i",a1);
};
myBlock1(); // 2.block中可以定义和外界同名的变量, 并且如果在block中定义了和外界同名的变量, 在block中访问的是block中的变量
int a2 = ;
void (^myBlock2)() = ^{
int a2 = ;
NSLog(@"a = %i", a2);
};
myBlock2(); // 3.默认情况下, 不可以在block中修改外界变量的值
// 因为block中的变量和外界的变量并不是同一个变量
// 如果block中访问到了外界的变量, block会将外界的变量拷贝一份到堆内存中
// 因为block中使用的外界变量是copy的, 所以在调用之前修改外界变量的值, 不会影响到block中copy的值 int a3 = ;
NSLog(@"&a = %p", &a3);
void (^myBlock3)() = ^{
//a3 = 50; //不能修改外界的值,
NSLog(@"&a = %p", &a3);
NSLog(@"a = %i", a3);
};
a3 = ;
myBlock(); // 如果想在block中修改外界变量的值, 必须在外界变量前面加上__block
// 如果在block中修改了外界变量的值, 会影响到外界变量的值
__block int a4 = ;
NSLog(@"&a = %p", &a4);
void (^myBlock4)() = ^{
a4 = ;
NSLog(@"&a = %p", &a4);
NSLog(@"a = %i", a4);
};
myBlock4();
NSLog(@"a = %i", a4); // int a53 = 10; // 如果没有添加__block是值传递
// void (*myBlock53)() = &__main_block_impl_0( __main_block_func_0, &__main_block_desc_0_DATA, a);
// (myBlock53)->FuncPtr)(myBlock53); // 为什么不加__block不能在block中修改外界变量的值
int a5 = ;
void (^myBlock5)() = ^{
// a5 = 10;
NSLog(@"a = %i", a5);
};
myBlock5(); // a = 10; // 如果加上__block之后就是地址传递, 所以可以在block中修改外界变量的值
// void (*myBlock)() = &__main_block_impl_0(__main_block_func_0, &__main_block_desc_0_DATA, &a, 570425344); // 为什么加了__block就可以在block中修改外界变量的值
__block int a6 = ;
void (^myBlock6)() = ^{
a6 = ;
NSLog(@"a = %i", a6);
};
myBlock6(); // block是存储在堆中还是栈中
// 默认情况下block存储在栈中, 如果对block进行一个copy操作, block会转移到堆中
// 如果block在栈中, block中访问了外界的对象, 那么不会对对象进行retain操作
// 但是如果block在堆中, block中访问了外界的对象, 那么会对外界的对象进行一次retain // 如果在block中访问了外界的对象, 一定要给对象加上__block, 只要加上了__block, 哪怕block在堆中, 也不会对外界的对象进行retain
// 如果是在ARC开发中就需要在前面加上__weak
__block Person *p = [[Person alloc] init]; // 1 // 如果在做iOS开发时, 在ARC中不这样写容易导致循环引用
// Person *p = [[Person alloc] init];
// __weak Person *weakP = p; NSLog(@"retainCount = %lu", [p retainCount]);
void (^myBlock7)() = ^{
NSLog(@"p = %@", p); // 2
// NSLog(@"p = %p", weakP);
NSLog(@"block retainCount = %lu", [p retainCount]);
};
Block_copy(myBlock7);
myBlock7(); [p release]; // return ;
}

oc62--block1的更多相关文章

  1. tensorflow,object,detection,在model zoom,新下载的模型,WARNING:root:Variable [resnet_v1_50/block1/unit_3/bottleneck_v1/conv3/BatchNorm/gamma] is not available in checkpoint

    现象: WARNING:root:Variable [resnet_v1_50/block1/unit_1/bottleneck_v1/conv1/BatchNorm/beta] is not ava ...

  2. SDWebImage源码解读之SDWebImageDownloaderOperation

    第七篇 前言 本篇文章主要讲解下载操作的相关知识,SDWebImageDownloaderOperation的主要任务是把一张图片从服务器下载到内存中.下载数据并不难,如何对下载这一系列的任务进行设计 ...

  3. Objective-C中block的底层原理

    先出2个考题: 1. 上面打印的是几,captureNum2 出去作用域后是否被销毁?为什么? 同样类型的题目: 问:打印的数字为多少? 有人会回答:mutArray是captureObject方法的 ...

  4. YII 2.x 模板文件的 beginBlock、beginContent、beginCache

    echo '-----------beginBlock--------------------- <br />'; $this->beginBlock('block1', false ...

  5. MySQL引擎、索引和优化(li)

    一.存储引擎 存储引擎,MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选择不同的技术 ...

  6. jQuery动画与特效详解

    本文主要是讲解和学习jQuery的自动显隐,渐入渐出等. 1.显示和隐藏hide()和show() 对于动画来说,显示和隐藏是最基本的效果之一,本节简单介绍jQuery的显示和隐藏. 代码如下: &l ...

  7. 一步步实现ABAP后台导入EXCEL到数据库【1】

    在SAP的应用当中,导入.导出EXCEL文件的情况是一个常见的需求,有时候用户需要将大量数据定期导入到SAP的数据库中.这种情况下,使用导入程序在前台导入可能要花费不少的时间,如果能安排导入程序为后台 ...

  8. Block 代码快

    1.原理 1.1block类型 a.全局bock块   贯彻整个程序 b.栈块  存在于栈内存中,作用域中使用 c.堆块  自行管理其内存 注*:http://blog.parse.com/learn ...

  9. jQuery中Animate进阶用法(一)

    jQuery中animate的用法你了解多少呢?如果仅仅是简单的移动位置,显示隐藏,哦!天哪你在浪费资源!因为animate太强大了,你可以有很多意想不到的用法!让我们一起研究一下吧~~ 首先要了解j ...

  10. 大话css之display的Block未解之谜(一)

    用了几年的css了,css中inline | block |inline-block|table|flex从来没有做过系统的整理和分析,网上的分析文章也很多,零散. 今天有空,就在这做一下整理分析 b ...

随机推荐

  1. 常用的Axure操作方法(1)

    1. 保存原型图片到本地,如在网页上看到图标素材,好多个在一张图上.                                   如上图所示,将图片拖入axure中,利用分割或者裁剪,把小图标 ...

  2. C#入门经典 Chapter5 变量的更多内容

    5.1类型转换 1.类型转换 1.1隐式转换:所有情况下可进行,编译器执行转换. 1.2显示转换 强制转换:强迫数据从一种类型转换为另一种类型. (<destinationType>)&l ...

  3. webpack 打包后 Uncaught SyntaxError: Unexpected token <

    问题描述:npm run dev 没报错.是可以正常运行的, npm run build 过程也没报错, 但是打开dist   index.html  就报错了  错误内容:       解决方法: ...

  4. Linux 配置JDK + MyEclipse

    版本:Ubuntu16.04: jdK: Java SE Development Kit 8u102; My Eclipse: 10.6; JDK配置的细致步骤参见此处. 就一点要注意: 请使用代码进 ...

  5. windows环境安装python虚拟环境

    虚拟环境安装参考 https://www.cnblogs.com/suke99/p/5355894.html workon环境变量配置参照 https://www.cnblogs.com/jiuyan ...

  6. img、a标签的使用

    <!doctype html><html><head><meta charset="utf-8"><title>无标题文 ...

  7. Day 13 进程和线程

    进程和线程 今天我们使用的计算机早已进入多CPU或多核时代,而我们使用的操作系统都是支持“多任务”的操作系统,这使得我们可以同时运行多个程序,也可以将一个程序分解为若干个相对独立的子任务,让多个子任务 ...

  8. 面试bb

    1.面试者进行自我介绍 2.学校/学历/大学生活及课程的心得总结(人品,性格评估) 3.技能介绍(是否对应聘工作有帮助,评估学习能力):编程/操作系统/测试工具/测试方法/脚本 4.离职原因/项目经验 ...

  9. select 如何将文本居中

    开始测试了几种方式但是结果都是失败的,最后测试一种方式终于成功了,所以做下笔记: select{ width: 3.2rem; height: 1.2rem; border-radius: 0.6re ...

  10. Tomcat启动失败--Several ports (8005, 8080, 8009)

    启动Tomcat服务器报错: Several ports (8005, 8080, 8009) required by Tomcat v7.0 Server at localhost are alre ...