ios block(2)

来源:未知 责任编辑:责任编辑 发表时间:2015-09-17 09:44 点击:

p>        KSLog(@"  > outside variable = %d", outsideVariable);  

p>        KSLog(@"  > inside variable = %d", insideVariable);  

p>          

p>        [outsideArray addObject:@"AddedInsideBlock"];  

p>    };  

p>      

p>    outsideVariable = 30;  

p>    self.memberVariable = 30;  

p>  

p>  

p>    blockObject();  

p>      

p>    KSLog(@"  > %d items in outsideArray", [outsideArray count]);  

p>}  

p> 

p> 

p> 

p>输出结果为:

p> 

p> 

p>  > member variable = 30

p>  > outside variable = 10

p>  > inside variable = 20

p>  > 1 items in outsideArray

p>注意到没?outside 变量的输出值为10,虽然outside变量在定义 block 之后在定义 block 所在的方法 testAccessVariable 中被修改为 20 了。这里的规则就是:blockObject 在实现时会对 outside 变量进行只读拷贝,在 block 块内使用该只读拷贝。因此这里输出的是拷贝时的变量值 10。如果,我们想要让 blockObject 修改或同步使用 outside 变量就需要用 __block 来修饰 outside 变量。

p> 

p> 

p>__block NSInteger outsideVariable = 10;

p> 注意:

p> 

p> 

p>a),在上面的 block 中,我们往 outsideArray 数组中添加了值,但并未修改 outsideArray 自身,这是允许的,因为拷贝的是 outsideArray 自身。 

p> 

p> 

p>b),对于 static 变量,全局变量,在 block 中是有读写权限的,因为在 block 的内部实现中,拷贝的是指向这些变量的指针。

p> 

p> 

p>c), __block 变量的内部实现要复杂许多,__block 变量其实是一个结构体对象,拷贝的是指向该结构体对象的指针。

p> 

p> 

p> 

p> 

p> 

p>2,非内联(inline) block 不能直接访问 self,只能通过将 self 当作参数传递到 block 中才能使用,并且此时的 self 只能通过 setter 或 getter 方法访问其属性,不能使用句点式方法。但内联 block 不受此限制。

p>[cpp]  

p>typedef NSString* (^IntToStringConverter)(id self, NSInteger paramInteger);  

p>- (NSString *) convertIntToString:(NSInteger)paramInteger  

p>                 usingBlockObject:(IntToStringConverter)paramBlockObject  

p>{  

p>    return paramBlockObject(self, paramInteger);  

p>}  

p>  

p>  

p>typedef NSString* (^IntToStringInlineConverter)(NSInteger paramInteger);  

p>- (NSString *) convertIntToStringInline:(NSInteger)paramInteger  

p>                 usingBlockObject:(IntToStringInlineConverter)paramBlockObject  

p>{  

p>    return paramBlockObject(paramInteger);  

p>}  

p>  

p>  
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • Lexical or Preprocessor Issue 'xxx.h
  • ios学习笔记(二)xcode 4.3.2下实现基本交互
  • ios学习笔记(一)xcode 4.3.2下创建第一个ios项目
  • UITableView一些方法
  • IOS类似iphone通讯录TableView的完整demo【附源码】
  • ios版本的helloworld
  • iPhone SDK开发:本地文本文件内容的读取
  • 如何为Iphone应用创建启动界面
  • 去掉屏幕键盘的方法
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1