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

一 、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 控制器中的属性



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值