oc62--block1
//
// 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的更多相关文章
- 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 ...
- SDWebImage源码解读之SDWebImageDownloaderOperation
第七篇 前言 本篇文章主要讲解下载操作的相关知识,SDWebImageDownloaderOperation的主要任务是把一张图片从服务器下载到内存中.下载数据并不难,如何对下载这一系列的任务进行设计 ...
- Objective-C中block的底层原理
先出2个考题: 1. 上面打印的是几,captureNum2 出去作用域后是否被销毁?为什么? 同样类型的题目: 问:打印的数字为多少? 有人会回答:mutArray是captureObject方法的 ...
- YII 2.x 模板文件的 beginBlock、beginContent、beginCache
echo '-----------beginBlock--------------------- <br />'; $this->beginBlock('block1', false ...
- MySQL引擎、索引和优化(li)
一.存储引擎 存储引擎,MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选择不同的技术 ...
- jQuery动画与特效详解
本文主要是讲解和学习jQuery的自动显隐,渐入渐出等. 1.显示和隐藏hide()和show() 对于动画来说,显示和隐藏是最基本的效果之一,本节简单介绍jQuery的显示和隐藏. 代码如下: &l ...
- 一步步实现ABAP后台导入EXCEL到数据库【1】
在SAP的应用当中,导入.导出EXCEL文件的情况是一个常见的需求,有时候用户需要将大量数据定期导入到SAP的数据库中.这种情况下,使用导入程序在前台导入可能要花费不少的时间,如果能安排导入程序为后台 ...
- Block 代码快
1.原理 1.1block类型 a.全局bock块 贯彻整个程序 b.栈块 存在于栈内存中,作用域中使用 c.堆块 自行管理其内存 注*:http://blog.parse.com/learn ...
- jQuery中Animate进阶用法(一)
jQuery中animate的用法你了解多少呢?如果仅仅是简单的移动位置,显示隐藏,哦!天哪你在浪费资源!因为animate太强大了,你可以有很多意想不到的用法!让我们一起研究一下吧~~ 首先要了解j ...
- 大话css之display的Block未解之谜(一)
用了几年的css了,css中inline | block |inline-block|table|flex从来没有做过系统的整理和分析,网上的分析文章也很多,零散. 今天有空,就在这做一下整理分析 b ...
随机推荐
- Leetcode0523--Continuous Subarray Sum 连续和倍数
[转载请注明]https://www.cnblogs.com/igoslly/p/9341666.html class Solution { public: bool checkSubarraySum ...
- C#入门经典 Chapter4 流程控制
4.1布尔逻辑 布尔比较运算符 == != < > <= >= 处理布尔值的布尔值运算符 ! & | ^(异或) 条件布尔运算符 &&am ...
- [Android]有关外部链接唤醒App需要注意的坑
移动互联网发展到今天,一个移动app需要和各种各样的外部链接关联,它不再仅仅从手机的桌面启动,更多的将会从其他的应用.浏览器链接.短信.二维码或者微信分享等渠道启动,这里涉及到的是各种各样的营销渠道和 ...
- Rsync 传输不需要输入密码
1.背景 1) 一个作为服务器端:VM3(IP: 3.9.8.151) 2) 一个作为客户端:VM2(IP: 3.9.8.157) 3) 服务器端和客户端网络 ...
- java_File对象
package File; import java.io.File; import java.io.IOException; public class file { public static voi ...
- Redis 之持久化(rdb、aof)
Redis的持久化有2种方式 1快照 2是日志 测试aof:
- spring IOC bean间关系
1.0 继承关系 实体 package com.java.test5; import java.util.*; /** * @author nidegui * @create 2019-06-22 1 ...
- ARM异常中断返回的几种情况
在学习韦老师视频中中断异常部分时候,对于发生中断时需要执行的#保存异现场 #恢复现场 中的“返回”弄不清楚,查阅网络文章后,发现一篇概述我觉得我能理解的一篇如下: 重要基础知识:R15(PC)总是 ...
- 怎么选择最适合自己的Python培训机构?
Python培训已经成为入门Python的一个重要途径,它的优势在于学习知识的系统性.快速性和实用性.Python培训毕业的学员大多数拥有较强的实战动手能力,能够较快上手,更符合企业需求. 不过,大部 ...
- Gym - 101611D Decoding of Varints(阅读理解题 )
Decoding of Varints 题意&思路: 首先根据红色边框部分的公式算出x,再有绿色部分得知,如果x是偶数则直接除以2,x是奇数则(x+1)/-2. PS:这题有数据会爆掉un ...