2017-04-18 103 views
0

基督復活(復活節快樂)!
在小應用程序重構後測試應用程序時,我收到了「Crashlytics」崩潰日誌。 正在嘗試更改模型以通過將所有下一個調用(從第二個調用開始)發送到專用串行隊列來避免雙重同步方法調用(同時)。我已添加以下代碼:如何找出在IOS設備上導致錯誤崩潰報告的原因?

@interface SynchronizationModel() 

@property (nonatomic) dispatch_queue_t synchronizationQueue; 

@end 

@implementation SynchronizationModel 

BOOL isSynchronizationNotCalled = YES; 

#pragma mark - Synchronization 

+ (dispatch_queue_t)synchronizationQueue { 
    static dispatch_queue_t queue; 
    static dispatch_once_t onceToken; 
    const char *queueID = "com.app.synchronizationModel.queue"; 

    dispatch_once(&onceToken, ^{ 
     queue = dispatch_queue_create(queueID, DISPATCH_QUEUE_SERIAL); 

    }); 

    return queue; 
} 

+ (void)sychronizeOfflineObjects { 
    if (isSynchronizationNotCalled) { 
     NSLog(@"%d synchronization without a queue, flag notCalled =", isSynchronizationNotCalled); 
     isSynchronizationNotCalled = NO; 
     [self synchronizeOfflineObjectsNonAsynchronous]; 
    } else { 
     NSLog(@"%d synchronization inside of a queue, flag notCalled =", isSynchronizationNotCalled); 
     isSynchronizationNotCalled = NO; 
     __weak typeof(self)weakSelf = self; 
     dispatch_async(self.synchronizationQueue, ^{ 
      __strong typeof(weakSelf)strongSelf = weakSelf; 
      [strongSelf synchronizeOfflineObjectsNonAsynchronous]; 
     }); 
    } 
// [self sychronizeOfflineObjects]; - uncomment for recursive test 
    isSynchronizationNotCalled = YES; 
    } 

如您所見,使用遞歸調用它進行測試。它確實有效。但有機會嘗試在設備上親自運行應用程序。
在少數地方調用此方法。主要在一個明顯的控制器:

- (IBAction)buttonWasTapped:(id)sender { 
    if(self.buttonImage.layer.animationKeys.count == 0){ 
     [self synchronizationMethod]; 
    } 
} 

- (void)synchronizationMethod { 
    NSLog(@"startWorkWithServer - originally here is some code but it works perfect"); 
     [SynchronzationModel sychronizeOfflineObjects]; 
    } else { 
     [self startAnimation]; 
     [self performSelector:@selector(delayStop) withObject:nil afterDelay:2.0]; 
     if([webConnectionAllowed isEqualToString:@"NotAllowed"]){ 
      [self showAlertWithTitle:nil message:NSLocalizedString(@"Connection is allowed", nil)]; 
     } 
    } 
} 

已將應用程序發送到我的團隊負責人結帳。 他已經在設備上啓動了一個應用程序,但是在一瞬間(猜測它已經工作了一段時間),它以SIGABRT錯誤消息拒絕。

Crashlytics報告返回:

#0. Crashed: com.twitter.crashlytics.ios.exception 
0 App       0x18751d CLSProcessRecordAllThreads + 820509 
1 App       0x18751d CLSProcessRecordAllThreads + 820509 
2 App       0x187415 CLSProcessRecordAllThreads + 820245 
3 App       0x17b34f CLSHandler + 770895 
4 App       0x185dfb __CLSExceptionRecord_block_invoke + 814587 
5 libdispatch.dylib    0x1c942083 _dispatch_client_callout + 22 
6 libdispatch.dylib    0x1c94e33b _dispatch_barrier_sync_f_invoke + 50 
7 App       0x1857fd CLSExceptionRecord + 813053 
8 App       0x185625 CLSExceptionRecordNSException + 812581 
9 App       0x18513b CLSTerminateHandler() + 811323 
10 libc++abi.dylib    0x1c4f393f std::__terminate(void (*)()) + 78 
11 libc++abi.dylib    0x1c4f3443 __cxa_rethrow + 90 
12 libobjc.A.dylib    0x1c4ff1bb objc_exception_rethrow + 42 
13 CoreFoundation     0x1d1a55a1 CFRunLoopRunSpecific + 596 
14 CoreFoundation     0x1d1a5341 CFRunLoopRunInMode + 104 
15 GraphicsServices    0x1e97cbfd GSEventRunModal + 156 
16 UIKit       0x223b3e27 -[UIApplication _run] + 574 
17 UIKit       0x223ae551 UIApplicationMain + 150 
18 App       0x148daf main (main.m:14) 
19 libdispatch.dylib    0x1c96f50b (Missing) 

但因爲至少我沒有的dSYM文件(從Crashlytics僅.txt)的可以去看我來symbolicate崩潰日誌或瞭解是什麼原因導致沒有明顯的方式問題。要在我的設備上測試它,但不確定它是否會崩潰。

它看起來有什麼事發生與線程,但我不知道到底是什麼線索。有人可以建議如何找出造成問題的地方嗎?

還有一個補充:有一些人在一個項目上工作(我對它很陌生),我甚至不確定上面的代碼是否已經打開了錯誤(但很可能)或者它甚至在我發生變化之前。我剛剛找到一個小方法,第一次正常調用方法,並將所有其餘的調用發送到專用串行隊列。由於它遞歸地工作,這是非常小的變化,並且只使用一個額外的專用串行隊列,所以它讓我困惑,似乎對於真正的崩潰(與報告中的線程問題)有點太小。

將不勝感激任何意見。

+0

您還沒有提供過的定義:'synchronizeOfflineObjectsNonAsynchronous' – Brandon

+0

是的,猜測這個模型在我做了更改之前工作正常,所以我只添加了自己創建的代碼。而且這也會讓這個帖子變得更大。但如果你認爲它可以澄清這種情況,我可以添加更多的代碼? – Alexander

+0

+(void)synchronizeOfflineObjectsNonAsynchronous {[self changeUser];如果([AppGroups allObjects] .count == 0){[[OfflineChangesModel sharedInstance] finish];返回; } if(!mainGroupId){[self synchronizationForNoMainGroupID]; } else {[self synchronizationForMainGroupID]; }}。如果需要的話,我可以爲synchronizationForNoMainGroupID和synchronizationForMainGroupID添加更多的代碼,但是在我對上面所做的更改進行修改之前,它一直運行良好。 – Alexander

回答

0

似乎我應該在這裏使用正確的修飾符。將「strong」添加到synchronizationQueue屬性可解決此問題。

此帖有助於找到解決方案。

What property should I use for a Dispatch Queue after ARC?

ARC之前使用的隊列就像一個非對象類型進行處理,從而「分配」走了很長的路要走。將它留空會生效,因爲它是非對象類型的默認修飾符。

沒有在引入ARC之後,隊列被視爲和Objective-c對象一樣,我們應該對它們使用「strong」。值得一提的是,「strong」現在是Objective-c對象的默認屬性屬性,但仍不確定爲什麼它在上面給出的情況下沒有解決。