ios block

来源:未知 责任编辑:责任编辑 发表时间:2015-09-17 09:44 点击:
一、block内局部变量无法修改,但为什么可以添加数组? p> 

p> 

p>[cpp]  

p>NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"a",@"b",@"abc",nil];  

p>NSMutableArray *mArrayCount = [NSMutableArray arrayWithCapacity:1];  

p>[mArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock: ^(id obj,NSUInteger idx, BOOL *stop){  

p>        [mArrayCount addObject:[NSNumber numberWithInt:[obj length]]];  

p>    }];  

p> 

p> 

p>    

p>    

p>    OC中数组等对象,是一个指针

p>数组添加/删除对象,指针本身并没有变化

p>因此,除非在block里对数组进行赋值,否则任何操作都是可行的。

p> 

p> 

p>下面总结下,block下变量的访问权限:

p> 

p> 

p>相同作用域下,局部变量在block内是只读的

p>相同作用域下,带__block修饰的变量,在block内是可读写的

p>静态变量和全局变量在block内是可读写的。

p>当block内使用了局部变量时,block会在栈上保存一份局部变量(block都是存储在栈上的),保存的变量在block里是一个常量,所以不能修改。

p> 

p> 

p>若是OC中的对象,blcok会retain,等执行完毕后再release。

p> 

p> 

p>如果有带__block的变量,那么block就可以对此变量进行修改。由此可见,带__block的变量不是线程安全的。iOS中,我们经常通过设置request的completionBlock来简化代码时,就需要注意到这一点。

p> 

p>[cpp]  

p>typedef void (^TestBlock) (void);  

p>    int val = 20;  

p>    TestBlock block1 = ^{ NSLog (@"%d", val); };  

p>    val = 50;  

p>    TestBlock block2 = ^{ NSLog (@"%d", val); };  

p>    val = 5;  

p>    TestBlock block3 = ^{ NSLog (@"%d", val); };  

p>    block1();  

p>    block2();  

p>    block3();  

p>    //output: 20 50 5  

p> 

p> 

p>    

p>//例如:(无ARC)

p>//__block id safeSelf = self;

p>//(有ARC)

p>//__weak id safeSelf = self;        //ios 5

p>// __unsafe_unretained id safeSelf = self; //ios 4

p> 

p> 

p>二,block 注意事项

p>1,block 在实现时就会对它引用到的它所在方法中定义的栈变量进行一次只读拷贝,然后在 block 块内使用该只读拷贝。

p> 

p> 

p>如下代码:

p> 

p> 

p>[cpp]  

p>- (void)testAccessVariable  

p>{  

p>    NSInteger outsideVariable = 10;  

p>    //__block NSInteger outsideVariable = 10;  

p>    NSMutableArray * outsideArray = [[NSMutableArray alloc] init];  

p>      

p>    void (^blockObject)(void) = ^(void){  

p>        NSInteger insideVariable = 20;  

p>        KSLog(@"  > member variable = %d", self.memberVariable);  
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • 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