__block的作用】的更多相关文章

__block 的标记告诉编译器,这个变量在 block 里面需要做特殊处理. 一般来说,在 block 中用的变量值是被复制过来的,所以对于变量本身的修改并不会影响这个变量的真实值.而当我们用 __block 标记的时候,表示在 block 中的修改对于 block 外也是有效地. 具体可参见 https://developer.apple.com/library/ios/documentation/cocoa/Conceptual/Blocks/Articles/bxVariables.ht…
block普通引用 默认情况下,在block中访问外部变量是通过复制一个变量来操作的,既可以读,但是写操作不对原变量生效,下面通过代码来举证 NSString *a = @"testa"; NSLog(@"block前,a在堆中的地址%p,a在栈中的地址%p",a,&a); void(^testBlock)(void) = ^(void){ NSLog(@"block内,a在堆中的地址%p,a在栈中的地址%p",a,&a); };…
看下图 在c语言中,2个独立的函数是不可能互相访问局部变量的,但是__block提供了这个功能,它不单单能读变量,还可以对变量进行写!上图说明,block获得了i最后的真实值5,没有只取得0,这都是"__block"的作用.再看j,由于没有__block前缀,只取得了0,没有获得5.__block的作用简单的说,就是copy了一份副本到heap中,并维护这个副本的生存,所以可以使用已经结束了的函数中的局部变量.…
Block //定义一个求两个数最大值函数 int maxValue (int ,int); //函数的实现 int maxValue (int a, int b){ return  a > b ? a : b; } //函数指针 (调用可以用 p 或者 maxValue) int (* p)(int,int) = maxValue; int max =  p(24, 48); block是一个匿名函数,也是一个函数,只不过没有名字而已.也叫语法块. 把函数名去掉剩余的部分就是函数类型. 对于B…
<span style="font-size:24px;">为什么要使用block变量呢? 由于当我们的程序比較繁杂的时候,我们在一个函数中要调用一个函数,还须要在外边来定义,实现,非常不方便,可是有了block变量我们就能够在一个函数的内部来定义一个block变量,相当于又在函数的内部来定义了一个函数. int (^max)(int x,int y) = ^(int x,int y)//求两个数的最大值 { return x > y ? x :y; }; NSLog…
   /*-------------------MRC环境中-------------------------*/     //使用局部变量:a到block块中,为了在block中能够使用这个变量,将a拷贝放到常量区域//    int a = 10;       //如果访问局部对象,为了在block中能够使用这个对象,引用计数值加一     //注意:如果使用__block修饰,计数值则不加一 //-----------block对全局变量的影响-----------       //blo…
----------------------MRC情况下Block内存分析---------------------------- 1.如果在block中使用全局变量,他为了持有这个变量,会将对应的对象加一 2.使用__block,避免循环引用 3.在block中使用局部变量的时候,会将变量复制一份存放到常量区(可以使用,但是不可以更改) 4.在MRC环境下:block中访问局部对象的时候,会将计数值加一5.在MRC环境下:__block的作用:(1)修饰局部对象的时候,不会被block加一 …
    面试题 block的原理是怎样的?本质是什么? __block的作用是什么?有什么使用注意点? block的属性修饰词为什么是copy?使用block有哪些使用注意? block在修改NSMutableArray,需不需要添加__block? 首先对block有一个基本的认识 block本质上也是一个oc对象,他内部也有一个isa指针.block是封装了函数调用以及函数调用环境的OC对象. 探寻block的本质 首先写一个简单的block int main(int argc, const…
说明:阅读本文,请参照之前的block文章加以理解: 一.循环引用的本质 //代码——ARC环境 void test1() { Person *per = [[Person alloc] init]; per.age = ; per.block = ^{ NSLog(@"-------1"); }; } int main(int argc, const char * argv[]) { @autoreleasepool { test1(); // test2(); } NSLog(@&…
本篇博客不再讲述Block的基本定义使用,最近而是看了很多的block博客讲述的太乱太杂,所以抽出时间整理下block的相关底层知识,在讲述之前,提出几个问题,如果都可以回答出来以及知道原理,大神绕过,反之,希望本篇博客对大家面试或者block不熟悉者有所帮助,以后会不断更新博客,欢迎关注和指正!!! blcok的原理是怎样的?本质又是什么? __block的作用是什么?有什么使用注意点? block的属性修饰词为什么是copy修饰?使用block有哪些使用注意事项? block在修改NSMut…
1.NSArray与NSSet的区别? NSArray内存中存储地址连续,而NSSet不连续 NSSet效率高,内部使用hash查找:NSArray查找需要遍历 NSSet通过anyObject访问元素,NSArray通过下标访问 2.NSHashTable与NSMapTable? NSHashTable是NSSet的通用版本,对元素弱引用,可变类型:可以在访问成员时copy NSMapTable是NSDictionary的通用版本,对元素弱引用,可变类型:可以在访问成员时copy (注:NSH…
一.__block理解: Blocks可以访问局部变量,但是不能修改, 声明block的时候实际上是把当时的临时变量又复制了一份, 在block里即使修改了这些复制的变量,也不影响外面的原始变量.即所谓的闭包. 如果修改局部变量,需要加__block. API Reference对__block变量修饰符有如下几处解释 //A powerful feature of blocks is that they can modify variables in the same lexical scop…
浅析匿名函数.lambda表达式.闭包(closure)区别与作用 所有的主流编程语言都对函数式编程有支持,比如c++11.python和java中有lambda表达式.lua和JavaScript中有闭包(closure).ObjectC中有块(blocks,^).那么这几个概念有什么共性和区别呢,只用普通函数不行吗,为什么要创造这些炫酷的概念呢? 一.匿名函数.lambda.closure区别 从功能性上说lambda和closure(或是OC中的blocks)是一个东西,只是不同语言的不同…
API Reference对__block变量修饰符有如下几处解释: //A powerful feature of blocks is that they can modify variables in the same lexical scope. You signal that a block can modify a variable using the __block storage type modifier. //At function level are __block vari…
Blocks是C语言的扩充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了这个新功能“Blocks”.从那开始,Block就出现在iOS和Mac系统各个API中,并被大家广泛使用.一句话来形容Blocks,带有自动变量(局部变量)的匿名函数. Block在OC中的实现如下: struct Block_layout { void *isa; int flags; int reserved; void (*invoke)(void *, ...); struct Bl…
在 <iOS面试题集锦(附答案)> 中有这样一道题目: 在block内如何修改block外部变量?(38题)答案如下: 默认情况下,在block中访问的外部变量是复制过去的,即:写操作不对原变量生效.但是你可以加上 __block 来让其写操作生效,示例代码如下: __block int a = 0; void (^foo)(void) = ^{ a = 1; }; foo(); //这里,a的值被修改为1 这是 微博@唐巧_boy的<iOS开发进阶>中的第11.2.3章节中的描述…
默认情况下,在block中访问的外部变量是复制过去的.但是可以加上 __block  来让其写操作生效. 原理: Block 不允许修改外部变量的值,这里所说的外部变量的值,指的是栈中指针的内存地址. __block 所起到的作用就是只要观察到该变量被 block 所持有,就将 外部变量 在栈中的内存地址放到了堆中.进而在 block 内部也可以修改外部变量的值. Block 不允许修改外部变量的值,是考虑到了block的特性,block也属于 函数 的范畴,变量进入block,实际就是已经该变…
API Reference对__block变量修饰符的解释,大概意思: 1.__block对象在block中是可以被修改.重新赋值的. 2.__block对象在block中不会被block强引用一次,从而不会出现循环引用问题. API Reference对__weak变量修饰符的解释,大概意思: 使用了__weak修饰符的对象,作用等同于定义为weak的property.自然不会导致循环引用问题,因为苹果文档已经说的很清楚,当原对象没有任何强引用的时候,弱引用指针也会被设置为nil. 因此,__…
API Reference对__block变量修饰符有如下几处解释: //A powerful feature of blocks is that they can modify variables in the same lexical scope. You signal that a block can modify a variable using the __block storage type modifier. //At function level are __block vari…
API Reference对__block变量修饰符有如下几处解释: //A powerful feature of blocks is that they can modify variables in the same lexical scope. You signal that a block can modify a variable using the __block storage type modifier. //At function level are __block vari…
http://www.cocoachina.com/ios/20150106/10850.html 我们知道在Block使用中,Block内部能够读取外部局部变量的值.但我们需要改变这个变量的值时,我们需要给它附加上__block修饰符. __block另外一个比较多的使用场景是,为了避免某些情况下Block循环引用的问题,我们也可以给相应对象加上__block 修饰符. 为什么不使用__block就不能在Block内部修改外部的局部变量? 我们把以下代码通过 clang -rewrite-ob…
三.Block中__block实现原理 我们继续研究一下__block实现原理. 1.普通非对象的变量 先来看看普通变量的情况. #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { __block int i = 0; void (^myBlock)(void) = ^{ i ++; NSLog(@"%d",i); }; myBlock(); return 0; } 把上述代…
API Reference对__block变量修饰符有如下几处解释: //A powerful feature of blocks is that they can modify variables in the same lexical scope. You signal that a block can modify a variable using the __block storage type modifier. //At function level are __block vari…
"You can specify that an imported variable be mutable—that is, read-write— by applying the __block storage type modifier."文档已经清楚说明了它的作用.反汇编就是要看个究竟. __block类型有着它自己的storage,是blocks编程的一部分,今天先来看一下它如何做storage的. 我们定义如下: NSString* c = [@"ab"…
if __name__== "__main__" 的意思(作用)python代码复用 转自:大步's Blog  http://www.dabu.info/if-__-name__-__main__-mean-function-python-code-reuse.html 有人在学习python脚本时会发现有的脚本下面有几行代码;   1 2 if __name__== "__main__": main() 不明白其中的意思,其实这就是方便我们代码复用的,我们可以在…
linux下的文件结构,看看每个文件夹都是干吗用的/bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动的配置文件和脚本 /home 用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示 /lib 标准程序设计库,又叫动态链接共享库,作用类似windows里的.dll文件 /sbin 系统管理命令,这里存放的是系统管理员使用的管理程序 /tmp 公用的临时文件存储点 /root 系统管理员的主目录(呵呵,特权…
[转自:http://www.jianshu.com/p/6c366b53ea41] 在每个 github 项目的右上角,都有三个按钮,分别是 watch.star.fork,但是有些刚开始使用 github 的同学,可能对这三个按钮的使用却不怎么了解,包括一开始使用 github 的我也是如此,这篇博客,结合自己的理解和使用,说说这三个按钮的用法以及一些个人见解. 如下图所示这是我们经常看到的三个按钮.   从左至右,依次是 watch star fork,下面分别说下他们的具体作用. wat…
今天尝试使用struts2+ urlrewrite+sitemesh部署项目,结果发现welcome-file-list中定义的欢迎页不起作用: <welcome-file-list> <welcome-file>/index.jsp</welcome-file> </welcome-file-list> 启动服务器后,直接输入http://localhost:8080/project 终是报404错误,初步猜测是由于没有找到index.jsp这个文件造成的…
如下一段配置,熟悉DWR的再熟悉不过了:<servlet>   <servlet-name>dwr-invoker</servlet-name>   <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>   <init-param>    <param-name>debug</param-name>    <para…
SQLSERVER中NULL位图的作用 首先感谢宋沄剑提供的文章和sqlskill网站:www.sqlskills.com,看下面文章之前请先看一下下面两篇文章 SQL Server误区30日谈-Day6-有关NULL位图的三个误区 char nchar varchar nvarchar的区别 在SQLSERVER内部有很多地方都使用到了位图技术,包括执行计划,数据库系统页面,复制,还有这篇文章说到的数据行中的NULL位图 执行计划中有位图运算符 数据库系统页面有:DCM页面.BCM页面,详细请…