//https://www.jianshu.com/p/d28a5633b963

#import <Foundation/Foundation.h>

void (^FFGlobalBlock)(void) = ^{
NSLog(@"");
};
int main(int argc, const char * argv[]) {
@autoreleasepool {
FFGlobalBlock();
     // NSGlobalBlock NSMallocBlock NSStackBlock(在ARC下基本不可能出现)
NSLog(@"%@", [FFGlobalBlock class]);
// 在函数内定义,但是Block没有引用外部变量,故是 NSGlobalBlock
void(^FFGlobalBlock2)(void) = ^{
NSLog(@"");
};
FFGlobalBlock2();
NSLog(@"%@", [FFGlobalBlock2 class]); /// 在ARC下,自动生成将block从Stack上复制到Malloc上的代码。
/// 这些情况下栈上的代码将copy到malloc上。
/// 调用Block的Copy方法。
/// 将Block作为函数的返回值。
/// 将Block复制给__strong修饰的变量时。
/// 向cocoa框架中含有usingBlock的方法或者GCD的API传递Block参数时。 /// RAC下对象的默认修饰符是 automic readwirte Strong 此时在ARC下是 NSMallockBlock。 在MRC下是 NSStackBlock。 /// Block会截获自动变量。会在block中复制一份只想该变量的指针。故不能修改值,但如果是对象的话可以对对象里的属性进行操作,如果是Person实例,不能修改这个实例,但是可以修改他的属性,即更改Person的Name,age等。
/// __block修饰的自动变量可以进行修改是因为 将__block修饰的自动变量封装成立一个结构体放在malloc上,以便从栈上或堆上访问和修改同一份数据。 int i = ;
void(^FFMallocBlock)(void) = ^{
NSLog(@"%d", i);
};
/// 如果想修改的话,用__block修饰block
i = ;
FFMallocBlock();
NSLog(@"%d", i);
NSLog(@"%@", [FFMallocBlock class]); NSLog(@"---%@", [^{NSLog(@"%d", i);} class]);
} /// 避免block的循环引用的三种方法。
/// 1: 使用__weak修饰。通常与__strong配合使用
/// 2: 使用__block修饰。问题,必须调用一次,并且要置为nil 否则存在内存泄漏。
// __block XXViewcontroller *weakSelf = self;
// self.blk = ^{
// NSLog(@"%@", weakSelf);
// weakSelf = nil;
// }
/// 3: 以参数的形式传入。可以避免
// self.block = ^(ViewController *vc){
// NSLog(@"%@", vc.name);
// } return ;
}

iOS Block初探的更多相关文章

  1. iOS Block界面反向传值

    在上篇博客 <iOS Block简介> 中,侧重解析了 iOS Block的概念等,本文将侧重于它们在开发中的应用. Block是iOS4.0+ 和Mac OS X 10.6+ 引进的对C ...

  2. iOS block从零开始

    iOS block从零开始 在iOS4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调. block的结构 先来一段简单的代码看看: void ...

  3. iOS block 机制

    本文要将block的以下机制,并配合具体代码详细描述: block 与 外部变量 block 的存储域:栈块.堆块.全局块 定义 块与函数类似,只不过是直接定义在另一个函数里,和定义它的那个函数共享同 ...

  4. ios Block详细用法

    ios Block详细用法 ios4.0系统已开始支持block,在编程过程中,blocks被Obj-C看成是对象,它封装了一段代码,这段代码可以在任何时候执行.Blocks可以作为函数参数或者函数的 ...

  5. iOS Block的本质(四)

    iOS Block的本质(四) 上一篇文章iOS Block的本质(三)中已经介绍过block变量的捕获,本文继续探寻block的本质. 1. block内修改变量的值 int main(int ar ...

  6. # iOS Block的本质(三)

    iOS Block的本质(三) 上一篇文章iOS Block的本质(二)中已经介绍过block变量的捕获,本文继续探寻block的本质. 1. block对对象变量的捕获,ARC 环境 block一般 ...

  7. iOS Block的本质(二)

    iOS Block的本质(二) 1. 介绍引入block本质 通过上一篇文章Block的本质(一)已经基本对block的底层结构有了基本的认识,block的底层就是__main_block_impl_ ...

  8. iOS Block的本质(一)

    iOS Block的本质(一) 1.对block有一个基本的认识 block本质上也是一个oc对象,他内部也有一个isa指针.block是封装了函数调用以及函数调用环境的OC对象. 2.探寻block ...

  9. (译)IOS block编程指南 1 介绍

    Introduction(介绍) Block objects are a C-level syntactic and runtime feature. They are similar to stan ...

随机推荐

  1. java 同步

    本文主要记录java进行同步的方案及锁优化的方法,来自<深入理解jvm> 定义 线程安全:多线程访问一个对象时,不用考虑这些线程在运行时环境下的调度与交替执行,也不需要额外的同步或调用方进 ...

  2. 详解python2 和 python3的区别-乾颐堂

    看到这个题目大家可能猜到了我接下来要讲些什么,呵呵,对了,那就是列出这两个不同版本间的却别!搜索一下大家就会知道,python有两个主要的版本,python2 和 python3 ,但是python又 ...

  3. app怎么测试性能

    性能测试一般来说 都是代码能力相对薄弱的测试人员 进阶的一个方向:但是当你成为一个真正的全栈人才的时候你就不得不学习代码: APP 或者安卓手机 或者iOS  一本测试他的性能的话都是采用:手机安装一 ...

  4. RocketMQ的客户端连接数调查

    RocketMQ版本:3.4.6 ==问题现象== RocketMQ集群的某个topic,在一部分节点上消费有“断层”,这部分数据一致没办法消费. ==调查过程== 一顿操作猛如虎的调查之后发现, 该 ...

  5. centos6.5 设置ssh无密码登录

    :关闭防火墙 vim /etc/selinux/config 把SELINUX=enforcing修改为SELINUX=disabled   A机器root连接B机器root用户 (root用户登录) ...

  6. Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享

    Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享 支付宝十年账单上的数字有点吓人,但它统计的项目太多,只是想看看到底单纯在淘宝上支出了多少,于是写了段脚本,统计任意时间段淘宝订单的消费情况,看 ...

  7. 2018.09.09 bzoj4403: 序列统计(Lucas定理)

    传送门 感觉单调不降序列什么的不好做啊. 于是我们序列中下标为i的元素的值加上i,这样就构成了一个单调递增的序列. 问题就变成了: 求出构造长度分别为1 ~ n且每个元素的值在l+1 ~ r+n之间的 ...

  8. Django模型层(2)

    https://www.cnblogs.com/yuanchenqi/articles/8963244.html from django.db import models class Author(m ...

  9. 进度条ProgressBar

    在本节中,作者只写出了进度条的各种样式,包括圆形.条形,还有自定义的条形,我想如果能让条形进度条走满后再继续从零开始,于是我加入了一个条件语句.作者的代码中需要学习的是handler在主线程和子线程中 ...

  10. python 实现排列组合

    1.python语言简单.方便,其内部可以快速实现排列组合算法,下面做简单介绍. 2.一个列表数据任意组合 2.1主要是利用自带的库 #_*_ coding:utf-8 _*_ #__author__ ...