Block控制器传值和内存泄漏

(1)Block是C语言的,是一种数据类型。Block出现后,很多代理都会被替代。Block是一种数据类型,是提前准备好的代码段,在需要的时候执行。其实就像调用一个函数一样。准备代码就是{},执行就是();

(2)Block常见问题:

*在定义Block时,如果引用了外部变量,会对外部变量做一次copy,记录住定义block时候变量的值,如果后续这个变量变了,也不会影响block的变化,这一瞬间是几就是几

*默认情况下不允许Block修改外部变量,因为拷贝是const拷贝。因为Block可以当一个函数,不应该破坏外部细节(就像NSString用copy一样不可变)

*如果要修改外部变量,用__block 修饰。不过修饰后,这个变量的地址永久变成了堆区了(不加__block修饰的,是一个栈一个堆,是两个地址,所以没法改)。

*如果访问的外部变量是一个OC对象(NSString Person*),那么其实只是拷贝到堆区的只是 这个OC对象在栈区的指针(*p),指针指向的内容还是在堆区的内容,没有变,唯一变的只是指针的地址,而不是指针指向的地址。此时,修改NSString的内容,其实没事!因为Block拷贝的是指向这个内容的地址。

(3)Block的应用场景:

*当做参数:用的很多。

*当做返回值:需要先定义这个返回值类型的Block(TypedefBlock),这一步类似定义了int,然后再声明。当做返回值用的比较少,用于框架比较多。

*控制器/自定义视图传值回调 , 异步任务回调。

(4)多个控制器反向传值:

*代理:我传递数据的话,我写@propertyDelegate,我写协议,你遵守我,我给你值。

*Block:我传递数据的话,我写@propertyBlock,我写Block,我来调用Block(),你来填充Block的内容(就是代理的实现,只是写在了一起)。

如果回调方法比较少,一个方法里,有三个以内的block就差不多可以了,如果很多还是用代理吧。Block的好处就是所有代码都在一起,便于维护,好多在一起反而不好了。例如UITableView的代理方法有小20个,数据源方法也有10多个,像这种分工明确,回调多,但是不需要每一个方法都必须事件,这时候就用代理。

Block和代理都需要判断是否执行。Block如果不判断,对方没有实现Block内容的话,就会野指针EXC_BAD_ACCESS,因为找方法找不到。

(5)Block的循环引用:__weak *weakSelf = self;

/**

block的陷阱-有可能会出现循环引用

解决办法:

1. 要对内存对象之间的引用关系要清楚

技巧:

1. 在block中碰到self,要格外小心,有可能会出现循环引用,通常最好思考一下

2. 利用dealloc协助判断!如果不能被正常释放就说明有循环引用!

*/

(6)UINavigationControllers有个ViewControllers属性,这个其实是栈处理器。说白了就是子控制器之间都是NaviController管理的,A,B,C子控制器被弹出来的时候,是ViewCotrollers数组对A,B,C进行强引用。而不是B弹出C,B强引用C。所以这一波控制器之间的传递Block其实是没有循环引用的,但是自定义View和控制器之间就很可能循环引用。所以看到self.就思考下是否循环引用。

时间: 2024-12-25 14:48:05

Block控制器传值和内存泄漏的相关文章

如何查看程序是否有内存泄漏,并且定位内存泄漏代码位置(VC++)

1.什么是内存泄漏? 内存泄漏指的是在程序里动态申请的内存在使用完后,没有进行释放,导致这部分内存没有被系统回收,久而久之,可能导致程序内存不断增大,系统内存不足--引发一系列灾难性后果:(关于程序申请内存分配方式,详见:内存分配方式) 2.零容忍 排除内存泄漏对于程序的稳健型特别重要,尤其是程序需要长时间.稳定地运行时.C++这类动态内存申请释放都是由程序员控制的语言,稍不注意,很有可能就会有未释放的内存.这类问题,虽然有的时候仅仅只是泄漏了几个字节,但是危害极大.因此,我们一般都是要做到:内

block的内存泄漏

block的内存泄漏(当前控制器是MJViewController) 1.1下面黄线警告的那句代码是有内存泄漏的,这是block引起的. 1.2 解决办法

iOS 简单的 block & 内存泄漏问题

注意 : block 用 copy 引用  typedef int (^MyBlock)(int, int); void play() { NSLog(@"play mp3"); } int main(int argc, const char * argv[]) { @autoreleasepool { MyBlock sumBlock =  ^(int a, int b){ return  a + b; }; MyBlock minusBlock =  ^(int a, int b)

(转)从内存管 理、内存泄漏、内存回收探讨C++内存管理

http://www.cr173.com/html/18898_all.html 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对 C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃 C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C++超绝的性能

Cocos开发中性能优化工具介绍之Visual Studio内存泄漏检测工具——Visual Leak Detector

那么在Windows下有什么好的内存泄漏检测工具呢?微软提供Visual Studio开发工具本身没有什么太好的内存泄漏检测功能,我们可以使用第三方工具Visual Leak Detector(以下简称vld). vld工具是VC++环境下一款小巧易用.免费开源的内存泄漏检测工具,vld可以显示导致内存泄漏的完整内存分配调用堆栈.vld的检测报告能够对每个内存泄漏点提供完整的堆栈跟踪,并且包含其源文件及行号信息. 安装过程是,先在到地址http://vld.codeplex.com/下载vld安

Linux/Unix用valgrind检测内存泄漏

c\c++编程中,内存管理是比较头疼的问题,一不小心就会造成内存泄漏,除了养成良好的编程习惯外(使用智能指针等),使用工具也能帮助检测内存泄漏,valgrind是Unix\Linux下一款不错的工具.(mac下暂时有bug) Valgrind 安装 到www.valgrind.org下载最新版valgrind-3.2.3.tar.bz2 解压安装包:tar –jxvf valgrind-3.2.3.tar.bz2 解压后生成目录valgrind-3.2.3 cd valgrind-3.2.3 运

Cocos2d-x Win32中使用Visual Leak Detector (for VC++)检查内存泄漏

Visual Leak Detector(vld,下载地址http://vld.codeplex.com/,当前版本v2.2.3)是VC++环境下一款小巧易用.免费开源的内存泄漏检测工具,相较于VC提供 的CRT Debug Library,vld可以显示导致内存泄漏的完整内存分配调用堆栈.vld具有以下一些特性: 对每个leaked block提供完整的堆栈跟踪,并且包含其源文件及行号信息(符号信息完整时) 能检测出进程内绝大多数类型的leaks,包括COM-based leaks和纯Win3

iOS - 内存管理之超级大坑内存泄漏QAQ

??前段时间被分配到查内存泄漏这种大坑,不胜惶恐!!!结果还真的跳进去了,爬了好长一段时间都没爬出来QAQ.每天开着Leaks各种捣鼓爱啪啪,然后看到一大波"神奇"的内存泄露信息,头都大了. ??不过这虽然是个大坑,不过趁着这次机会可以把内存管理知识好好实践了一遍.或许现在大多数的新项目都是ARC的了,然而在一些实际的大项目中,会重用很多诺干年前(其实也就几年前)的代码,QAQ,而这些代码会有很多实现采用的是MRC的方式,所以项目中就经常可以见到混合着ARC和MRC这两种不同内存管理模

innerHTML引起IE的内存泄漏

内存泄漏常见的原因有三种: 1. 闭包 2. 未解除事件绑定 3. 循环引用DOM元素 除此之外,还有一种泄漏原因少有人知,它和innerHTML有关,不过很容易解决. 出现这种内存泄漏需要有三个条件: 1. 内存中存在一个未加入DOM树的元素 2. 给这个元素设置innerHTML,注意,必须是能创建元素并且绑定了DOM 0级事件 3. 必须在这个元素加入DOM树前设置它的innerHTML 举个例子: // 创建一个仅存在于内存中的元素 var el = document.createEle