專案中遇到的一些問題小結

談笑書生阿澤發表於2018-06-30

最近專案中遇到兩個關於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
複製程式碼

網上也有人講了

相關文章