Eine App, die wir vor einigen Jahren entwickelt haben, stürzt seit iOS 10 ab. Die App zeigt UIImagePickerControllers wiederholt an, damit ein Benutzer mehrere Fotos eines Objekts erfassen kann. Nach mehr als 40 Mal stürzt die App ab. Dies ist auf allen Geräten, auf denen wir getestet haben, reproduzierbar, aber nicht vor der Einführung von iOS 10. Wir haben die Schlüssel NSCameraUsageDescription und NSPhotoLibraryUsageDescription in der Datei Info.plist.Warum stürzt meine App auf iOS 10 ab, wenn UIImagePickerControllers wiederholt präsentiert und verwendet wird?
Ich habe eine minimale Beispiel-App erstellt, die das Problem veranschaulicht. Hier ist der Code, der schließlich in dem Crash-Ergebnisse:
- (IBAction) cameraPressed:(id) sender {
self.picker = [[UIImagePickerController alloc] init];
self.picker.sourceType = UIImagePickerControllerSourceTypeCamera;
self.picker.delegate = self;
self.picker.allowsEditing = NO;
[self presentViewController:self.picker animated:YES completion:nil];
}
Wenn der Benutzer wiederholt verwendet die Kamera-Taste, die zu diesem IBAction verbunden ist, beginnt es schließlich zu verlangsamen (Präsentation des Pickers länger beginnt nehmen), und schließlich stürzt ab (in der Regel nach 50+ Anwendungen der Kamera). Kein Crash-Protokoll erzeugt wird, obwohl, wenn sie Xcode verbunden ist, eine Ausgabe wie diese in der Konsole erscheint zum Absturz führte:
2016-11-04 20:30:11.884984 WLPBeta[2747:275474] [MC] Invalidating cache
2016-11-04 20:30:11.890776 WLPBeta[2747:273019] [MC] Reading from public effective user settings.
2016-11-04 20:30:13.017608 WLPBeta[2747:275091] [MC] Invalidating cache
2016-11-04 20:30:13.018312 WLPBeta[2747:273019] [MC] Reading from public effective user settings.
2016-11-04 20:30:19.271720 WLPBeta[2747:276311] [MC] Invalidating cache
2016-11-04 20:30:19.279462 WLPBeta[2747:273019] [MC] Reading from public effective user settings.
2016-11-04 20:32:08.229294 WLPBeta[2747:278515] [MC] Invalidating cache
2016-11-04 20:32:08.273941 WLPBeta[2747:273019] [MC] Reading from public effective user settings.
2016-11-04 20:32:09.335711 WLPBeta[2747:278514] [MC] Invalidating cache
2016-11-04 20:32:09.342161 WLPBeta[2747:273019] [MC] Reading from public effective user settings.
2016-11-04 20:32:14.193376 WLPBeta[2747:278515] [MC] Invalidating cache
2016-11-04 20:32:14.213902 WLPBeta[2747:273019] [MC] Reading from public effective user settings.
2016-11-04 20:32:47.944657 WLPBeta[2747:275091] [MC] Invalidating cache
2016-11-04 20:32:47.972053 WLPBeta[2747:273019] [MC] Reading from public effective user settings.
2016-11-04 20:32:48.550934 WLPBeta[2747:279485] [MC] Invalidating cache
2016-11-04 20:32:48.575065 WLPBeta[2747:273019] [MC] Reading from public effective user settings.
2016-11-04 20:32:50.855308 WLPBeta[2747:279485] [MC] Invalidating cache
2016-11-04 20:32:50.856329 WLPBeta[2747:273019] [MC] Reading from public effective user settings.
2016-11-04 20:32:52.201535 WLPBeta[2747:275091] [GatekeeperXPC] Connection to assetsd was interrupted or assetsd died
Ich habe auch einen Fehlerbericht an Apple geschrieben, und fügte hinzu, es Radar zu öffnen: http://www.openradar.me/radar?id=4941109843197952
Hat jemand dieses Problem gestoßen? Gibt es eine Lösung, die es uns ermöglicht, das Problem zu umgehen, ohne die App mit Xcode 8 neu zu kompilieren? Leider verwenden wir Bibliotheken von Drittanbietern, die noch nicht für Xcode 8 und das iOS 10 SDK bereit sind. Daher bauen wir die App weiterhin mit Xcode 7.3.1.
EDIT: Hier ist ein Link zu einem Github Repo, der eine Beispielanwendung enthält, mit der das Problem demonstriert werden kann.
https://github.com/lolay/ImagePickerTest
EDIT 2: Wenn ich den Code ändern, so dass ich den Picker in viewDidLoad zuzuordnen und initialisieren, stürzt immer noch nach etwa der gleichen Anzahl von Verwendungen der Kamera-Taste.
- (void)viewDidLoad {
[super viewDidLoad];
self.picker = [[UIImagePickerController alloc] init];
self.picker.sourceType = UIImagePickerControllerSourceTypeCamera;
self.picker.allowsEditing = NO;
}
- (IBAction) cameraPressed:(id) sender {
[self presentViewController:self.picker animated:YES completion:nil];
}
Haben Sie Instruments verwendet? Vielleicht haben Sie ein Speicherleck oder einen Referenzzyklus. – rmaddy
Wir haben und hat keine Lecks oder Referenzzyklen erkannt. Wie in der Frage erwähnt, kochte ich das Problem auf eine minimale Beispielanwendung mit nur ein paar Codezeilen, die dem von Xcode erstellten Skelettprojekt hinzugefügt wurden. Der Code, den ich hinzugefügt habe, wird in der Frage angezeigt. – Greg
Gibt es einen besonderen Grund, dass Sie imagePicker bei jedem Drücken der Taste initialisieren müssen? Warum verschieben Sie nicht alle Codezeilen zu viewDidLoad und wenn die Taste gedrückt wird, feuern Sie einfach die presentViewController-Methode? – repoguy