diff --git a/Classes/LinphoneManager.m b/Classes/LinphoneManager.m index 364caee4a..a25e84330 100644 --- a/Classes/LinphoneManager.m +++ b/Classes/LinphoneManager.m @@ -1387,7 +1387,8 @@ void popup_link_account_cb(LinphoneAccountCreator *creator, LinphoneAccountCreat // rare case, remove duplicated fileTransferDelegates to avoid crash [_fileTransferDelegates setArray:[[NSSet setWithArray:_fileTransferDelegates] allObjects]]; for (FileTransferDelegate *ftd in _fileTransferDelegates) { - [ftd stopAndDestroy]; + // Not remove here, avoid array mutated while being enumerated + [ftd stopAndDestroyAndRemove:FALSE]; } [_fileTransferDelegates removeAllObjects]; diff --git a/Classes/Utils/FileTransferDelegate.h b/Classes/Utils/FileTransferDelegate.h index acf6429c3..e2267cae0 100644 --- a/Classes/Utils/FileTransferDelegate.h +++ b/Classes/Utils/FileTransferDelegate.h @@ -30,6 +30,7 @@ - (void)cancel; - (BOOL)download:(LinphoneChatMessage *)message; - (void)stopAndDestroy; +- (void)stopAndDestroyAndRemove:(BOOL)remove; + (FileTransferDelegate *)messageDelegate:(LinphoneChatMessage *)message; @property() LinphoneChatMessage *message; diff --git a/Classes/Utils/FileTransferDelegate.m b/Classes/Utils/FileTransferDelegate.m index 48ec16a3c..a066e4b83 100644 --- a/Classes/Utils/FileTransferDelegate.m +++ b/Classes/Utils/FileTransferDelegate.m @@ -173,7 +173,13 @@ static void file_transfer_progress_indication_send(LinphoneChatMessage *message, } - (void)stopAndDestroy { - [[LinphoneManager.instance fileTransferDelegates] removeObject:self]; + [self stopAndDestroyAndRemove:TRUE]; +} + +- (void)stopAndDestroyAndRemove:(BOOL)remove { + if (remove) + [[LinphoneManager.instance fileTransferDelegates] removeObject:self]; + if (_message != NULL) { LinphoneChatMessage *msg = _message; _message = NULL;