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);
相关新闻>>
最新推荐更多>>>
- 发表评论
-
- 最新评论 更多>>