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