资讯专栏INFORMATION COLUMN

IOS Block 块用法

zhonghanwen / 1710人阅读

摘要:在苹果开发中广泛应用,如请求回调,并发执行等。定义类型定义一个属性设置触发设置事件引用了引用了内存泄露了调用参考

block在苹果app开发中广泛应用,如http请求回调,GCD并发执行等。

基本用法 定义
//定义一个本地变量的 block
returnType (^blockName)(parameterTypes) = ^returnType(parameters) {...};

//简化定义

typedef returnType (^TypeName)(parameterTypes);
TypeName blockName = ^returnType(parameters) {...};

  //例子
    //定义
    void (^MyBlock)(id,NSUInteger ,BOOL*)=^(id obj,NSUInteger idx ,BOOL *stop){
        NSLog(@" %@ ",obj);
    };
    //使用
    BOOL stop;
    MyBlock(@"ttt",1,&stop);

    //作为方法参数
    NSArray *citys=@[@"suzhou",@"hangzhou"];
    [citys enumerateObjectsUsingBlock:MyBlock];

    //内联用法
    [citys enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@" %@ ",obj);
    }];
访问上下文的能力

可以自由访问定义块方法栈内变量和堆变量,还有全局变量
__block 可直接引用变量可以修改

     // 本地变量
      NSString *lived=@"suzhou"
      __block int count=0;
      void (^MyBlock)(id,NSUInteger ,BOOL*)=^(id obj,NSUInteger idx ,BOOL *stop){
      NSString *city=(NSString *)obj;
      if([city isEqualsToString:lived){
          NSLog(@" i live in %@ ",obj);
      }else{
        NSLog(@" %@ ",obj);
        }
        count++;
    };
    //此时count=2
    NSArray *citys=@[@"suzhou",@"hangzhou"];
    [citys enumerateObjectsUsingBlock:MyBlock];
高级用法

block本质上是一个oc对象,所以可以存放在对象属性里面,在对象其他方法中来访问。

// 定义block类型
typedef int (^MathBlock)(int, int);

// 定义一个 mathblock 属性
@property (strong) MathBlock mathBlock;



// 设置block
- (void)doMathWithBlock:(MathBlock) mathBlock {
    self.mathBlock = mathBlock;

}

// 触发 设置block 事件
- (IBAction)buttonTapped:(id)sender {
    [self doMathWithBlock:^(int a, int b) {
        return a + b;
        //block 引用了 self self引用了block 内存泄露了
        //__weak typeof(self) weakSelf = self;
         //self.done();
         weakSelf.done();
    }];
}

-(void) done{
 NSLog(@"do math done");
}

// 调用block
- (IBAction)button2Tapped:(id)sender {
    self.label.text = [NSString stringWithFormat:@"%d", self.mathBlock(3, 5)];
}
参考:

http://www.raywenderlich.com/9438/how-to-use-blocks-in-ios-5-tutorial-...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/15709.html

相关文章

  • IOS基础-block用法

    摘要:函数有一个缺点,代码是死的,编译之前写好的代码块利用代码块事先将代码存起来和函数一样,有返回值有参数函数只能在方法外定义,而则可以在外边和里边都可以定义。行为主体可以用回传值,类型会被自动辨别。 Block 一般是用来表示、简化一小段的程式码,它特别适合用来建立一些同步执行的程式片段、封装一些小型的工作或是用来做为某一个工作完成时的回传呼叫(callback) 。 在新的iOS API...

    godlong_X 评论0 收藏0
  • 巧谈GCD

    摘要:谈到多线程,一般都会谈到四种方式和。现在,这些我们直接略过最后拾遗中会谈一下,苹果既然推荐使用,那么为什么还要纠结于线程呢需要关注的只有两个概念队列任务。主队列,与主线程功能相同。实际上,提交至的任务会在主线程中执行。 谈到iOS多线程,一般都会谈到四种方式:pthread、NSThread、GCD和NSOperation。其中,苹果推荐也是我们最经常使用的无疑是GCD。对于身为开发者...

    ymyang 评论0 收藏0
  • Css中display:inline-block用法详解

    摘要:从上面的这个分析,也不难理解为什么下,对块元素设置属性无法实现的效果。这时块元素仅仅是被触发了,而它本就是行布局,所以触发后,块元素依然还是行布局,而不会如中块元素呈递为内联对象。display:block就是将元素显示为块级元素 block元素的特点是: 总是在新行上开始; 高度,行高以及顶和底边距都可控制; 宽度缺省是它的容器的100%,除非设定一个宽度 , , , , 和...

    _ipo 评论0 收藏0
  • iOSBlock 循环引用问题

    摘要:可以看到内部捕获到的是,所以不会产生强引用,自然也就不会出现循环引用问题。我们通过置为解决它循环引用的方式,就是打断一条强引用。 循环引用是一个比较常见的问题,之前面试的时候也会被问到,如何解决循环引用问题,其实大家都知道使用__block,__weak这些修饰符可以解决循环引用问题,那今天我们要讨论的就是他们是怎么样解决了循环引用问题的。 __weak 其实__weak是比较好理解的...

    mrcode 评论0 收藏0
  • KVOController:facebook 开源的 KVO(Key-value Observing

    摘要:它提供了一个简单现代的,同时也是线程安全的。它有如下优点使用自定义或者回调进行通知观测者移除时无异常控制器时隐式的观测者移除提升使用的性能线程安全并提供在观测者恢复时额外的保护更多关于的信息,可浏览的文档用法项目中有把用于和的示例程序。 KVOController 是一个简单安全的 KVO(Key-value Observing,键-值 观察)工具,用于 iOS 和 OS X 应用开发...

    张巨伟 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<