//
// 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. Server Tomcat v8.0 Server at localhost failed to start 问题解决方法?

    bi编程jsp  servlet 第一个程序: HelloServlet 运行错误 404: 十月 28, 2017 11:25:14 上午 org.apache.tomcat.util.digest ...

  2. 编写高质量的js之恰当选用if和switch

    switch结构中存在很多限制,存在这些限制的主要目的是提高多重分支结构的执行效率.因此,如果能够使用switch结构,就不要选择if结构. 无论是使用if结构,还是使用switch结构,应该确保下面 ...

  3. IIS中实现http自动转换到https

    IIS中实现http自动转换到https修改以下文件:C:\WINDOWS\Help\iisHelp\common\403-4.htm 为以下内容<!DOCTYPE HTML PUBLIC &q ...

  4. GitHub代码托管平台搭建

    GitHub代码托管平台搭建 注册账户以及创建仓库 要想使用github第一步当然是注册github账号了, github官网地址:https://github.com/. 之后就可以创建仓库了(免费 ...

  5. C# 设定时间内自动关闭提示框

    通过程序来自动关闭这个消息对话框而不是由用户点击确认按钮来关闭.然而.Net framework 没有为我们提供自动关闭MessageBox 的方法,要实现这个功能,我们需要使用Window API ...

  6. mysql_数据查询_嵌套查询

    嵌套查询 一个SELECT-FROM-WHERE语句称为一个查询块. 嵌套查询:将一个查询块嵌套在另一个查询块的WHERE子句或者HAVING短语的条件中的查询. 注:子查询的SELECT语句中不能使 ...

  7. Web 服务器与应用服务器的区别是什么?

    不太严谨的说法:web服务器就是负责接收用户的Request,然后响应html等给客户浏览器.应用服务器处理一些业务逻辑等. 作者:luo链接:https://www.zhihu.com/questi ...

  8. Sping——使用注解创建切面

    为讲解例子,我们首先定义一个Performance接口: package aoptest; public interface Performance { public void perform(); ...

  9. spine骨骼动画组件使用详解

    1. spine骨骼动画工具 骨骼动画: 把动画打散, 通过工具,调骨骼的运动等来形成动画spine是一个非常流行的2D骨骼动画制作工具spine 动画美术人员导出3个文件:    (1) .png文 ...

  10. BZOJ 2442: [Usaco2011 Open]修剪草坪 单调队列

    Code: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm& ...