美文网首页
一句话笔记(29)( Release 和 Debug 的一个区别

一句话笔记(29)( Release 和 Debug 的一个区别

作者: 天空中的球 | 来源:发表于2017-09-03 20:18 被阅读116次

    一句话笔记,某段时间内遇到或看到的某个可记录的点。 2017-09-03

    • 阴影没显示出来,masksToBounds 的影响
    • 一个很奇怪的 Block 问题,Block 回调参数不一致, 而且仅仅是在 Release 下就崩溃
    一、阴影没显示出来,masksToBounds 的影响
    _editButton.layer.shadowOffset = CGSizeMake(1, 3);//shadowOffset阴影偏移
    _editButton.layer.shadowOpacity = 0.4f; // 阴影透明度
    _editButton.layer.shadowRadius = 3.0f; //阴影半径,默认3
    _editButton.layer.shadowColor = [UIColor blackColor].CGColor;
    

    发现这样设置后,一直没显示,觉的老奇怪了

    _editButton.layer.masksToBounds = YES;
    

    原来是 masksToBounds 的影响哦,设置后外边框不能显示,而阴影恰恰作为外边框绘制的。刚好两处属性的设置还不是在一块,😓。

    二、一个很奇怪的 Block 问题,Block 回调参数不一致, 而且仅仅是在 Release 下就崩溃
    typedef void (^TestBlock)();
    
    @interface FirstViewController : UIViewController
    
    @property (nonatomic, copy) TestBlock testBlock;
    
    @end
    
    if (self.testBlock) {
          self.testBlock();
    }
    
    firstVC.testBlock = ^(NSString *testStr){
        NSLog(@"Test  Block == %@",testStr);
    };
    
    上述这种用法在 Debug 下没有问题的,然而到 Release 下就崩溃了
    首先可以明确一点就是,此处读取testStr, 而 testStr已经不存在而导致崩溃的。

    当然正常的写法是这样的:

    firstVC.testBlock = ^{
        NSLog(@"Test  Block ");
    };
    

    问题就出来啦,为什么在 Release 下就好了,Debug 却没有问题

    • 在 Debug 下,testStr 打印的是 __NSGlobalBlock__
      没有捕获外部变量的 block 的类会是__NSGlobalBlock__ 即不在堆上,也不在栈上,它类似 C 语言函数一样会在代码段中。

    此时,我们需要注意下,Debug 和 Release 和内存分配和释放方式是不同的,Debug 模式下内存会延迟释放, weak 的对象会延迟,但Release下进行了优化, 达到释放条件会立即释放。

    所以此处可以理解为,该 Block 中这个值(__NSGlobalBlock__ )在 Release 环境下被立即释放了,当去读它的时候自然就是被当做野指针了,自然就崩了;而在 Debug 下却是延迟的,所以没有崩,维持了表面的良好。

    再次提醒: Debug 和 Release 和内存分配和释放方式是不同的!同时自己再次回顾了这篇 iOS 应用:Release与Debug编译方式的区别 文章。

    相关文章

      网友评论

          本文标题:一句话笔记(29)( Release 和 Debug 的一个区别

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