一 、block块 + Foundation框架
1.当作参数传递
1.当作参数传递
enumerateObjectsUsingBlock
作用:遍历数组中的元素
3.传递对象
二、使用block块进行值传递
; @end
在B controller 中使用 传递的值为con
2、在A controller中定义一个B controller的
在controller里定义block块
至此 A 控制器就能拿到B 控制器中的属性
<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
的方式
重要:解决循环引用的方法
把传入到block块中的对象之前加_weak
<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 控制器中的属性