IOS BLOCK收集

news/2024/7/20 14:27:09 标签: 移动开发, 内存管理

在ios,blocks是对象,它封装了一段代码,这段代码可以在任何时候执行。Blocks可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似,但是有区别:blocks是inline的,并且它对局部变量是只读的。 
Blocks的定义: 
         int (^Multiply)(int, int) = ^(int num1, int num2) {return num1 * num2;}; 
定义了一个Multiply的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现,注意{}blocks体里的;。 
Blocks可以访问局部变量,但是不能修改。 
              int multiplier = 7; 
     int (^myBlock)(int) = ^(int num) { 
         multiplier ++;//编译报错 
         return num * multiplier; 
     }; 
如果要修改就要加关键字:__block 
         __block int multiplier = 7; 
     int (^myBlock)(int) = ^(int num) { 
         multiplier ++;//这样就可以了 
         return num * multiplier; 
     };


...

在引用计数的环境里面,默认情况下当你在 block 里面引用一个 Objective-C 对象的时 候,该对象会被 retain。当你简单的引用了一个对象的实例变量时,它同样被 retain。 但是被__block 存储类型修饰符标记的对象变量不会被 retain. 注意:在垃圾回收机制里面,如果你同时使用__weak 和__block 来标识一个变量,那么该 block 将不会保证它是一直是有效的。

如果你在实现方法的时候使用了 block,对象的内存管理规则更微妙: 如果你通过引用来访问一个实例变量,self 会被 retain。
如果你通过值来访问一个实例变量,那么变量会被 retain。

 

 
dispatch_async(queue, ^{
 
// instanceVariable is used by reference, self is retained
 
doSomethingWithObject(instanceVariable);
 

});

 
 
 
id localVariable = instanceVariable;
 
dispatch_async(queue, ^{
 

// localVariable is used by value, localVariable is retained (not self)

 
doSomethingWithObject(localVariable);
 

});



拷贝Blocks

通常,你不需要 copy(或 retain)一个 block.在你希望 block 在它被声明的作用域 被销毁后继续使用的话,你子需要做一份拷贝。拷贝会把 block 移到堆里面。

你可以使用 C 函数来 copy release 一个 block:

如果你使用 Objective-C,你可以给一个 block 发送 copy、retain release(或 autorelease)消息。

为了避免内存泄露,你必须总是平衡 Block_copy()和 Block_release()。你必须平衡 copy retain release(或 autorelease)--除非是在垃圾回收的环境里面。

 

 


转载于:https://www.cnblogs.com/GnagWang/archive/2012/01/04/2312495.html


http://www.niftyadmin.cn/n/1097176.html

相关文章

win10 x64下dosbox和masm5.0配置教程

一、工具下载() 主要工具: 1、dosbox DOSBox0.74-win32-installer.exe(32位) 下载地址: http://www.dosbox.com/download.php?main1 http://sourceforge.net/projects/dosbox/files/ 附上某盘地址:https://pan.baidu.com/s/1vgVBvP2RfWjLAL…

android开发真机调试 相关东东

android开发真机调试 相关东东 我们做android开发的时候,可以用模拟器,也可以真机调试,但是电脑配置不高的话,模拟器,真的是慢的有的一说,所以我一直倾向于用真机调试,但是问题也就来了&#xf…

破解有道翻译反爬虫机制(现在不能用了)

破解有道翻译反爬虫机制 web端的有道翻译,在之前是直接可以爬的。也就是说只要获取到了他的接口,你就可以肆无忌惮的使用他的接口进行翻译而不需要支付任何费用。那么自从有道翻译推出他的API服务的时候,就对这个接口做一个反爬虫机制&#x…

C语言小知识总结

// C语言指令小结 cc -c XXX.c 编译 cc XXX.o 链接 ./a.out 执行文件 ./ 当前路径 cc XXX.c 编译链接 ls -l 显示当前目录内容 clear 清屏 touch 新建一个文件夹 open 打开一个文件夹 cd 改变当前操作的目录 pwd …

如何让返回的对象为只读——一步步封装起来

首先说一句:提到封装,可能有些人想到的是把数据成员设为私有,其实个人觉得应该把封装看得广义一些:封装即隐藏。 大家应该常常遇到这样一种情况:通过一个类的方法返回一个对象、或对象列表(其实也是对象&am…

MyEclipse优化设置

(转***) ***********1、提示键配置 一般默认情况下,Eclipse ,MyEclipse 的代码提示功能是比Microsoft Visual Studio的差很多的,主要是Eclipse ,MyEclipse本身有很多选项是默认关闭的,要开发者自己去手动配置。如果开发…

kafka消息压缩官方说明翻译

文章目录kafka消息压缩官方说明CompressionDesignOffset management on the consumerBackwards compatibilityConfiguration changesCompression codecs supportedkafka消息压缩官方说明 原文地址:https://cwiki.apache.org/confluence/display/KAFKA/Compression C…

线性表的顺序存储(C代码实现)

线性表的顺序存储-- 线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。 线性表示什么?借助网上大佬的一个例子 小学生放学都是要按顺序…