iOS之blocks操作

1、替换delegate
来看下用block怎么处理。
 一个block语句的定义类似于C的函数,有返回值,有0到多个参数,接下来属性声明,跟一般的属性声明差不多: 
1 typedef void (^CallBack)(int index);
3 @property(nonatomic, copy)CallBack callBack; 
然后在b里面触发按钮事件的时候调用block,调用前最好先检查下是否为nil
1 - (IBAction)click2:(id)sender
 2 {
 3     if(self.callBack)
 4         self.callBack(2);
 5 }
 6 
 7 
 8 - (IBAction)click3:(id)sender
 9 {
10     if(self.callBack)
11         self.callBack(3);
12 } 
现在完成了调用,具体的实现在哪呢,我们回到a当中,在a中执行跳转界面的地方,加上相关的实现。
1     SecondViewController *secondController = [[SecondViewController alloc]initWithNibName:@"SecondViewController" bundle:nil];
2     
3     secondController.callBack = ^(int index)
4     {
5         self.clickBtnLabel.text = [NSString stringWithFormat:@"click %d", index];
6     };
7     
8     [self.navigationController pushViewController:secondController animated:YES]; 
在是用block的时候,要注意所有权的问题,要小心产生循环,那样会导致资源无法释放。
例如在block中使用了一个指针,恰巧这个指针又是block的拥有者,那么会产生一个循环引用,他们都是强引用,无法释放。为了避免产生类似的问题,就需要用__weak标记block的拥有者。delegate和block在上面时候是用,要看具体情况,如果一个类的delegate里有很多方法,那还是放在delegate里实现吧。
2、系统定义的block
ios当中还有大量系统已经定义好的block,使用这些block实现特定的一些功能,能是整体代码更加简洁和高效。
例如遍历字典的时候,ios就提供了: 
- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(id key, id obj, BOOL *stop))block; 
简单举个例子,我们要在字典中根据key来查找某个value,然后把value记录下来。
 1     NSArray *keyArray = @[@"aa", @"ddd", @"cc", @"bb", @"ww", @"111"];
 2     NSArray *valueArray = @[@"apple", @"ios", @"mac", @"xcode", @"view", @"array"];
 3     NSDictionary *enumDict = [NSDictionary dictionaryWithObjects:valueArray forKeys:keyArray];
 4     __block NSString *valueString = nil;
 5     [enumDict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){
 6         if([key isEqualToString:@"bb"])
 7         {
 8             valueString = obj;
 9             *stop = YES;
10         }
11     }]; 
整个过程变的简单了。
还有在实现UIView动画的时候,block能让我们更加简单高效的实现很多特效。
 
1     [UIView animateWithDuration:0.5 animations:^{
2         animateView.alpha = 0.0;
3     } completion:^(BOOL finished) {
4         animateView.alpha = 1.0;
5     }]; 
这段代码实现了view透明度从1.0变到完全透明,用时0.5秒,当动画结束后重新显示view
每天叫醒你的什么, 是生活的压力还是来自于你的理想,选择一种方式,选择一种生活,达内准备好了,你的选择在哪里?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值