美文网首页Effective Objective-C 2.0
📚Effective OC - Tip 37,38: 理解 bl

📚Effective OC - Tip 37,38: 理解 bl

作者: 小万叔叔 | 来源:发表于2017-01-10 16:49 被阅读10次

    ^ block 的代言人

    • 如果单单只作为一种 callback 或者函数指针的方式,我觉得并不足以体现 block 的强大,关键还是在于捕获变量。
    void (^ name) (int a)
    
    //Swift de closure 就更直接了
    () -> T 
    
    • Block 分为栈,堆,全局, 全局块不捕获任何状态,所以也就不会导致循环引用的问题, 例如 UIView 。
    - (void)testingHeapBlock:(BOOL)condition {
        //标准的栈block,在ARC模式下已经变成了堆block,MRC才是栈Block,都为NSMallocBlock
        void (^stackBlock)() = ^ {
            NSLog(@"enter stackBlock");
            self.current = @"123";
        };
        stackBlock();
        
        void (^heapBlock)();//放到函数外部就会造成循环引用,内部不会
        //这样写就变成了堆block了,因为有了赋值操作
        heapBlock = ^{
            NSLog(@"enter heapBlock");
            self.current = @"123";
        };
        heapBlock();
    }
    
    //NSGlocalBlock, 不捕获状态,所以也就不会循环引用
    void (^gobalBlock)(BlockViewController *type) = ^(BlockViewController *type){
        NSLog(@"global block is %@", type.current);
    };
    
    
    • 使用 Typedef 来声明会更清晰
        typedef void (^TypeBlock)(int a, int b);
        TypeBlock typeBlock = ^(int a, int b) {
            NSLog(@"enter typeBlock");
        };
    

    Extension

    block 与 delegate 的区别

    • block 方便,直观,就像吃蛋糕一样,我里面可以知道吃的味道, delegate 更强调过程,实际上应该是代理的设计模式,如果我要知道吃的过程中的蛋糕的松软程度,口感 等性质,是否可以用delegate反应出多种状态呢,像我们的 tableview 的 dataSource 以及 delegate.
    • 另外 block 可以捕获当前环境的变量这一点提供了很多便利,也是我们愿意用 block的原因,如果很多变量需要 捕获,那用 delegate 是不是又不方便了?

    相关文章

      网友评论

        本文标题:📚Effective OC - Tip 37,38: 理解 bl

        本文链接:https://www.haomeiwen.com/subject/mvakbttx.html