zoukankan      html  css  js  c++  java
  • block 总结

    CGPoint center = CGPointZero;
        CGPoint (^pointAddHandler)(CGPoint addPoint) = ^(CGPoint addPoint) {
        return CGPointMake(center.x + addPoint.x, center.y + addPoint.y);
    }
    center = CGPointMake(100, 100);
    NSLog(@"%@", pointAddHandler(CGPointMake(10, 10)));    //输出{10,10}
     
    block在捕获变量的时候只会保存变量被捕获时的状态(对象变量除外),之后即便变量再次改变,block中的值也不会发生改变。所以上面的代码在计算新的坐标值时center的值依旧等于CGPointZero
     
     

    循环引用

    开头说过,block在iOS开发中被视作是对象,因此其生命周期会一直等到持有者的生命周期结束了才会结束。另一方面,由于block捕获变量的机制,使得持有block的对象也可能被block持有,从而形成循环引用,导致两者都不能被释放:

    @implementation LXDObject
    {
        void (^_cycleReferenceBlock)(void);
    }
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        _cycleReferenceBlock = ^{
            NSLog(@"%@", self);   //引发循环引用
        };
    }
    @end
     
    遇到这种代码编译器只会告诉你存在警告,很多时候我们都是忽略警告的,这最后会导致内存泄露,两者都无法释放。跟普通变量存在__block关键字一样的,系统提供给我们__weak的关键字用来修饰对象变量,声明这是一个弱引用的对象,从而解决了循环引用的问题:
     
    __weak typeof(*&self) weakSelf = self;
    _cycleReferenceBlock = ^{
        NSLog(@"%@", weakSelf);   //弱指针引用,不会造成循环引用
    };
     
    对于block这种有趣的特性,在唐巧的谈Objective-C block的实现有详细介绍block的底层实现代码,我在这里就不多说了
  • 相关阅读:
    SignalR 聊天室实例详解(服务器端推送版)
    一种解决图片防盗链的方法
    python3基础-数学运算
    测试开发之路
    页面加载时让其显示笼罩层与加载等待图片
    在SQL SERVER中获取表中的第二条数据
    html+js 的一些小问题
    数据库连接错误问题
    ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。
    正则表达式实例
  • 原文地址:https://www.cnblogs.com/coolcold/p/7273126.html
Copyright © 2011-2022 走看看