最近專案中遇到兩個關於iOS8 系統下專案crash的問題,剛好專案做的差不多了,就寫下來做個記錄,以後方便檢視
****1、專案中用到系統的左滑刪除功能,正常情況下左滑刪除並沒什麼毛病,可怕的地方就在於測試小姐姐在左滑後並未刪除,而是直接點了螢幕左上角的返回按鈕
這下事大了,直接了當的crash掉,而且並未能看到任何有營養的日誌。
// 定義編輯樣式
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
return UITableViewCellEditingStyleDelete;
}
// 進入編輯模式,按下出現的編輯按鈕後,進行刪除操作
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
BaseConfig *aConfig = self.dataArray[indexPath.row];
[self.dataArray removeObjectAtIndex:indexPath.row];
SQLDataManager *manager = [SQLDataManager sharedDataManager];
[manager deleateSingleData:[aConfig.sTime substringWithRange:NSMakeRange(0, 4)] sID:aConfig.sID];
[self.tableview reloadData];
}
}
// 修改編輯按鈕文字
- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath {
return @"刪除";
}
複製程式碼
強大的main函式,你好,又見面了
Thread 1: EXC_BREAKPOINT (code=EXC_ARM_BREAKPOINT, subcode=0xdefe)
複製程式碼
習慣性開啟全域性斷點,開啟殭屍物件的開關,重複進行小姐姐的操作,終於看到了崩潰日誌,終於是看到了些
2018-06-01 16:48:45.534 WuYouQianBao[58470:4515935] *** -[QBSearchSuggestionViewController tableView:canEditRowAtIndexPath:]: message sent to deallocated instance 0x18837dc0
複製程式碼
看到這個,我開始以為是這個類寫的有記憶體洩漏,於是乎重寫dealloc方法,列印了一波
2018-06-01 16:48:45.518 [58470:4515935] 1111111---> dealloc
2018-06-01 16:48:45.520 [58470:4515935] 1111111---> dealloc
複製程式碼
看到這兩行日誌時候,都想罵娘了,什麼鬼?
作為一名優秀的“百度”程式設計師,怎麼會不問問度娘呢?於是乎開啟百度...
終於知道原因了,網上有大神說可能是蘋果的bug?終於可以摔鍋了~偷笑?
原因知道了,鍋也甩了,然後解bug
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[self.tableview setEditing:NO];
}
複製程式碼
在離開這個頁面時候設定下編輯狀態未不可編輯,完美解決~
****2、關於UITextView的一個bug,由於UITextView木有placeholder,而我們現在的設計總是會加上placeholder,此時就出現了兩條路 --->自己想辦法加個placeholder在系統UITextView上面
我們專案裡面寫了個categroy 用了強大的runtime給系統textView新增了一個placeHolder,然後就是這個categroy的鍋,導致在iOS8上面會產生crash,話說是在dealloc的時候removeObserver時候,可能有記憶體洩漏(據說是醬紫,而且只是掉remove的程式碼就能好)。就算是醬紫吧,註釋掉這個,或者iOS8 不做處理~
--->網上找找第三方常用的解決方案(YYTextView 就有placeholder) 由於我司專案是用的cocopod把category中封裝在私有庫中,負責私有庫的小哥哥覺得註釋掉remove不合適,心有不甘,而crash還依然纏繞著我,沒辦法只能#import <UIKit/UIKit.h>
@interface UITextView (HJPlaceHolder)
/**
給 UITextView 新增的 placeHolderView 可以用來配置樣式
*/
@property (nonatomic, strong) UITextView *hj_placeHolderTextView;
/**
通過 String 給 UITextView 新增 placeHolder
@param placeHolder placeHolder 上顯示的 string
*/
- (void)hj_addPlaceHolder:(NSString *)placeHolder;
@end
複製程式碼
#import "UITextView+HJPlaceHolder.h"
#import <objc/runtime.h>
static const char *hj_placeHolderTextView = "hj_placeHolderTextView";
@implementation UITextView (HJPlaceHolder)
- (UITextView *)hj_placeHolderTextView {
return objc_getAssociatedObject(self,hj_placeHolderTextView);
}
- (void)setHj_placeHolderTextView:(UITextView *)placeHolderTextView {
objc_setAssociatedObject(self, hj_placeHolderTextView, placeHolderTextView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (void)hj_addPlaceHolder:(NSString *)placeHolder {
if (![self hj_placeHolderTextView]) {
UITextView *textView = [[UITextView alloc] initWithFrame:self.bounds];
textView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
textView.font = self.font;
textView.backgroundColor = [UIColor clearColor];
textView.textColor = [UIColor grayColor];
textView.userInteractionEnabled = NO;
textView.text = placeHolder;
[self addSubview:textView];
[self setHj_placeHolderTextView:textView];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textViewDidBeginEditing:) name:UITextViewTextDidBeginEditingNotification object:self];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textViewDidEndEditing:) name:UITextViewTextDidEndEditingNotification object:self];
}
self.hj_placeHolderTextView.text = placeHolder;
}
# pragma mark -
# pragma mark - UITextViewDelegate
- (void)textViewDidBeginEditing:(NSNotification *)noti {
self.hj_placeHolderTextView.hidden = YES;
}
- (void)textViewDidEndEditing:(UITextView *)noti {
if (self.text && [self.text isEqualToString:@""]) {
self.hj_placeHolderTextView.hidden = NO;
}
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
@end
複製程式碼
Thread 1: EXC_BREAKPOINT (code=EXC_ARM_BREAKPOINT, subcode=0xdefe)
複製程式碼
2018-06-01 17:13:53.570 WuYouQianBao[58551:4520883] *** -[UITextView textInputView]: message sent to deallocated instance 0x1638e800
複製程式碼