blcok的总结

没有引用外部变量的block  为 __NSGlobalBlock__ 类型(全局block)

MRC:

引用外部变量的block  为 __NSStackBlock__ 类型(栈区block)  栈区中的block,申明属性用copy,可以从栈区拷贝到堆区

使用copy修饰的原因是 :防止block 在作用域结束之后还没有被调用 就被销毁  放到堆区就可以在作用域结束之后  还可以调用

ARC:

引用外部变量的block 为 __NSMallocBlock__ 类型(堆区block) 申明属性用copy或strong 修饰都可以 系统会自动将栈区block拷到堆区

block 引用外部的栈区的局部变量   将该变量从栈区中拷贝一份到堆区中

block 要改变外部局部变量的值  需要将外部局部变量 用__block修饰

面试题:

__block int i = 10;

//从栈自动拷贝到堆中,i也被拷贝

void (^myblock)() = ^{

NSLog(@"%d",i);        后输出i = 10

};

i= 20;

NSLog(@"----->%d",i);       先输出i = 20

[self passBlock:myblock];

循环引用的问题:

当 block 对当前控制器 强引用  控制器也对block强引用时  需要将控制器用  __weak修饰  防止循环引用的问题

总结:

关于block内存管理,当block内部没有引用外部变量时,block存放在全局区,也就是NSGlobalBlock;在MRC下,当block内部引用外部变量时,block存放在栈区,也就是NSStackBlock;当对该栈区的block进行copy操作时,block将存放在堆区。在ARC下,当block内部引用外部变量时,block存放在堆区;关于堆区与栈区的区别,栈区主要存放局部变量,定义的参数等,在函数结束,系统会自动回收其内存空间,而堆区一般用程序员自行分配释放,若程序员不释放,程序结束时,由系统回收。总的来说,使用栈区更为快捷,而使用堆区更为灵活。

时间: 2024-08-01 21:08:44

blcok的总结的相关文章

自定义下拉刷新控件

一.功能效果 1.在很多app中,在信息展示页面,当我们向下拖拽时,页面会加载最新的数据,并有一个短暂的提示控件出现,有些会有加载进度条,有些会记录加载日期.条目,有些还带有加载动画.其基本实现原理都相仿,本文中将探讨其实现原理,并封装出一个简单的下拉刷新控件 2.自定义刷新工具简单的示例 二.系统提供的下拉刷新工具 1.iOS6.0以后系统提供了自己的下拉刷新的控件:UIRefreshControl .例如,refreshControl,作为UITableViewController中的一个属

Block 简介

1.Blocks简介 Block字面意思就是代码块 iOS4.0.Mac OS X 10.6开始Apple引入的特性 Block是Objective C语言中的对象 但是与NSObject有所区别 Block是特殊的Objective C对象 Block 对象提供了一个使用 C 语言和 C 派生语言(如 Objective-C 和 C++)来创建表达式作为一个特别的函数.在其他语言和环境中,一个block对象有时候被称为“闭包(closure)”.在这里,它们通常被口语化为”块(blocks)”

GCD那些事儿

GCD GCD,全名Grand Central Dispatch,中文名郭草地,是基于C语言的一套多线程开发API,一听名字就是个狠角色,也是目前苹果官方推荐的多线程开发方式.可以说是使用方便,又不失逼格.总体来说,他解决我提到的上面直接操作线程带来的难题,它自动帮你管理了线程的生命周期以及任务的执行规则.下面我们会频繁的说道一个词,那就是任务,说白了,任务其实就是你要执行的那段代码. 任务管理方式--队列 上面说当我们要管理多个任务时,线程开发给我们带来了一定的技术难度,或者说不方便性,GCD

论文阅读(BaiXiang——【CVPR2016】Multi-Oriented Text Detection with Fully Convolutional Networks)

BaiXiang--[CVPR2016]Multi-Oriented Text Detection with Fully Convolutional Networks 目录 作者和相关链接 方法概括 方法细节 创新点和贡献 实验结果 问题讨论 总结与收获点 作者和相关链接 作者: paper下载 方法概括 Step 1--文本块检测: 先利用text-block FCN得到salient map,再对salient map进行连通分量分析得到text block: Step 2--文本线形成:

tfs三大管理工具操作示例

大家都知道tfs分布式存储安装方法,特别是v1版本的,v2版本的几乎没人讲,维护的文档更是少之又 少,tfs要是用好了确实是好东西,虽说开源了,但是很少人敢于尝试,主要是坑太多,坑太多是因为 需要了解的知识点太多,没有完善的文档,所以一直推广不起来,只能淘宝和与之相关的公司在用了 . 不多说了,能开源就不错啦,本篇只讲下tfs三大管理工具:tfstool ssm   admintool. 一,tfstool [[email protected] ~]# /usr/local/tfs/bin/tf

Hadoop之MapReduce工作原理

Hadoop由两部分组成,分别是分布式文件系统HDFS和分布式计算框架MapReduce.其中,分布式文件系统HDFS主要用于大规模数据的分布式存储,而MapReduce则构建在分布式文件系统上,对于存储在分布式文件系统的数据进行分布式计算. 1  MapReduce设计目标 HadoopMapReduce诞生于搜索领域,主要解决搜索引擎面临的海量数据处理扩展性差的问题.它的实现很大程度上借鉴了Google MapReduce的设计思想,包括简化编程接口.提高系统容错性等.总结HadoopMap

inode工作原理

inode的工作原理: 如果把blcok比作书中的内容,那么inode就是inode就是这个书的目录,inode中记录文件的是文件的元数据信息,如:权限.大小.属主属组.时间戳.以及数据块所在的位置等信息,blcok中存储的才是真正的数据 block:每个blcok默认大小是4k(创建文件系统的时候可以修改),且每个blcok只能给一个文件使用,例如,有一个1k的文件,把该文件放到block中,那么块中剩余的3k也不能用, blcok的大小需要根据实际应用情况来定,例如,现在把块大小设置为1k,

block的复习

main.m // //  main.m //  8A10.Block的复习 // //  Created by huan on 16/2/8. //  Copyright © 2016年 huanxi. All rights reserved. // #import <Foundation/Foundation.h> //函数定义 void test(){ } int sum(int a, int b){ return a + b; } int main(int argc, const ch

关于Block初识与自己的认识

前些天学到了Block,对于Block有了一些大致的认识 Block是什么? 我认为是一些行为的封装  举个例子  要将两个参数进行加减乘除    创建4个Block实现价钱乘除四个操作即可   用一个方法  传两个参数和一个block  返回就是block对这两个参数的操作 代码演示 1 #import <Foundation/Foundation.h> 2 #import "Calc.h" 3 int main(int argc, const char * argv[]