您的位置:首页 > 移动开发 > IOS开发

iOS开发 - Block块的使用(三)在iOS开发中的使用

2014-11-01 21:12 232 查看
一 、block块 + Foundation框架

1.当作参数传递
enumerateObjectsUsingBlock

作用:遍历数组中的元素

<span style="font-size:12px;">[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"第 %d 项内容是 %@", (int)idx, obj);
if ([@"王五" isEqualToString:obj]) {
*stop = YES;
}
}];</span>


2.使用局部变量
</pre><span style="font-size:12px;">使用stopIndex做停止标示符</span><pre name="code" class="objc"><span style="font-size:12px;">int stopIndex = 1;
NSArray *array = @[@"张三", @"李四", @"王五", @"赵六"];
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"第 %d 项内容是 %@", (int)idx, obj);
if ([@"王五" isEqualToString:obj] || idx == stopIndex) {
*stop = YES;
}
}];</span>


3.传递对象

对象传递进Block的方式

<span style="font-size:12px;">NSString *stopName = @"王五";
NSArray *array = @[@"张三", @"李四", @"王五", @"赵六"];
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"第 %d 项内容是 %@", (int)idx, obj);
if ([stopName isEqualToString:obj] || idx == stopIndex) {
*stop = YES;
}
}];</span>


为保证Block中的代码正常运行,在将stopName的指针传递给Block时,Block会自动对stopName的指针做强引用

4.把Block当成一种数据类型

既然Block是一种数据类型,那么可以将Block当做比较特殊的对象

<span style="font-size:12px;">#pragma mark 定义并添加到数组
@property (nonatomic, strong)  NSMutableArray *myBlock;
int(^sum)(int, int) = ^(int x, int y) {
return [self sum:x y:y];
};
[self.myBlocks addObject:sum];
int(^area)(int, int) = ^(int x, int y) {
return [self area:x y:y];
};
[self.myBlocks addObject:area];
#pragma mark 调用保存在数组中的Block
int(^func)(int, int) = self.myBlocks[index];
return func(x, y);</span>


重要:解决循环引用的方法

把传入到block块中的对象之前加_weak

<span style="font-size:12px;">__weak DemoObj *weakSelf = self;
int(^sum)(int, int) = ^(int x, int y) {
return [weakSelf sum:x y:y];
};</span>


二、使用block块进行值传递

现在需要在两个controller中传值 , 使用block块进行
1、在一个类中添加一个成员属性
@interface B Object
<pre name="code" class="objc"><pre name="code" class="objc">@property (nonatomic, strong) B *b;
<pre name="code" class="objc"><pre name="code" class="objc">@property (nonatomic, strong) B *b;




;

@end



在B controller 中使用 传递的值为con

</pre><pre name="code" class="objc">_addBlock(con);


2、在A controller中定义一个B controller的

@property (nonatomic, strong) B *b;


在controller里定义block块

_b.addBlock = ^(contact  *con){
NSLog(@"%@",con);
};


至此 A 控制器就能拿到B 控制器中的属性
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: