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

一句话笔记,某段时间内遇到或看到的某个可记录的点。 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 的一个区别))