216 SIGSEGV
SEGV_ACCERR
SIGSEGV通常由操作系统生成,但是有适当权限的用户可以在需要时使用kill系统调用或kill命令(一个用户级程序,或者一个shell内建命令)
来向一个进程发送信号。
闪退场景一:recorder deleteRecording 之前 先判断文件是否存在,否则会造成过度释放,解决方法:
if ([[NSFileManager defaultManager] fileExistsAtPath:self.recorder.url.path]) {
if (![self.recorder deleteRecording])
NSLog(@"Failed to delete %@", self.recorder.url);
}
闪退场景二: delegate = nil 。
将XXViewContrller设置为delegate时,当页面发生跳转时,XXViewController的对象会被释放,这是代码走到[_delegate callbackMethod],
便出现crash。解决方法有二:1.将@property (nonatomic ,assign) id <BLELibDelegate>delegate; 中 assign关键字改为weak。
2.在XXViewController的delloc方法中添加:xxx.delegate = nil;
实例:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
cell.delegate=self;
}
cell内部控件的点击事件通过代理方式如此实现时就会导致这个崩溃。
补充:SIG 是信号名的通用前缀, SEGV 是 segmentation violation 的缩写
在 POSIX 兼容的平台上,SIGSEGV 是当一个进程执行了一个无效的内存引用,或发生段错误时发送给它的信号。SIGSEGV 的符号常量在头文件 signal.h
中定义。因为在不同平台上,信号数字可能变化,因此符号信号名被使用。通常,它是信号11。
对于不正确的内存处理,如当程序企图访问 CPU 无法定址的内存区块时,计算机程序可能抛出 SIGSEGV。操作系统可能使用信号栈向一个处于自然状态的应用
程序通告错误,由此,开发者可以使用它来调试程序或处理错误。
在一个程序接收到 SIGSEGV 时的默认动作是异常终止。这个动作也许会结束进程,但是可能生成一个核心文件以帮助调试,或者执行一些其他特定于某些平台
的动作。
SIGSEGV可以被捕获。也就是说,应用程序可以请求它们想要的动作,以替代默认发生的动作。这样的动作可以是忽略它、调用一个函数,或恢复默认的动作。
在一些情形下,忽略 SIGSEGV 导致未定义行为。
一个应用程序可能处理SIGSEGV的例子是调试器,它可能检查信号栈并通知开发者目前所发生的,以及程序终止的位置。
tableView滑动删除,返回导致程序崩溃问题
- (void)tableView:(UITableView*)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyleforRowAtIndexPath:(NSIndexPath *)indexPath;
实现后,删除某个cell没有问题,但滑动一行但不选中delete按钮,就点击导航栏的返回按钮,出现了崩溃现象,而且崩溃是出现在跳回到之前的界面之后,崩溃之后提示打印出EXE_BAD_ACESSS错,
直接到了 main 函数里。问题可能是在 canEditRowAtIndexPath 这个方法里设置了YES然后返回的时候没有把它设置成 NO 所以报错,ios6会自动设置成NO,iOS7 就手动设置成 NO也可以。
方案一:viewWillDisappear手动设置 editing 这个属性为NO 解决。参考:http://blog.csdn.net/damon2989/article/details/44410367
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[self.tableView setEditing:NO];
}
方案二:在删除事件点击完成时reloadData也可以
- (NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath{
//添加一个删除按钮
UITableViewRowAction *deleteAction = [UITableViewRowAction rowActionWithStyle:(UITableViewRowActionStyleDestructive) title:@"删除" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) {
[tableView reloadData];
NSLog(@"****:delete");
}];
deleteAction.backgroundColor = [UIColor redColor];
//将设置好的按钮方到数组中返回
return @[deleteAction];
}
3.UIVisualEffectView报错的问题:
Assertion failure in -[UIVisualEffectView _addSubview:positioned:relativeTo:],
/BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3698.21.8/UIVisualEffectView.m:1464
(lldb)
添加全局断点找到错误所在:
[self.effectview addSubview:label]
UIVisualEffectView添加子View的方式不对,在ios 11上必须添加到它的contentView内:
[self.effectview.contentView addSubview: label];