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