2016-11-09 2 views
11

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]; 
} 
+0

Haben Sie Instruments verwendet? Vielleicht haben Sie ein Speicherleck oder einen Referenzzyklus. – rmaddy

+0

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

+0

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

Antwort

0

Versuchen Sie diesen Code.

- (IBAction) cameraPressed:(id) sender { 
    if (self.picker == nil){ 
     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]; 
} 
0

Haben Sie versucht, die Imagepicker Variable innerhalb der cameraPressed() Funktion

als STRONG
- (IBAction) cameraPressed:(id) sender { 
    UIImagePickerController *picker = [[UIImagePickerController alloc] init]; 
    picker.sourceType = UIImagePickerControllerSourceTypeCamera; 
    picker.delegate = self; 
    picker.allowsEditing = NO; 
    [self presentViewController:self.picker animated:YES completion:nil]; 
} 
1

Ihre UIImagePickerController definiert erklärt.

Bitte ändern Sie es in schwach oder stellen Sie sicher, dass das Objekt Null ist, bevor die Ansicht zerstört wird.

0

Sie müssen die UIImagePickerController explizit schließen, auch wenn es das automatisch tun wird angezeigt. Es behält wahrscheinlich den View-Controller bei, wenn Sie dies nicht tun, was zu Speicherproblemen führt.

Vom UIImagePickerControllerDelegate documentation:

Wenn Sie das Bild Picker showsCameraControls Eigenschaft auf NO und Ihre eigenen Kontrollen bieten, mehrere Bilder vor Entlassung des Bild Picker-Schnittstelle erfolgen.Wenn Sie jedoch die Eigenschaft auf YES setzen, muss Ihr Stellvertreter die Bildauswahlschnittstelle schließen, nachdem der Benutzer ein Bild erstellt oder die Operation abgebrochen hat.

Diese Eigenschaft ist standardmäßig YES, daher müssen Sie den Vorgang abbrechen.

Verwenden etwas ähnlich der folgenden:

- (IBAction) cameraPressed:(id) sender { 
    UIImagePickerController* picker = [[UIImagePickerController alloc] init]; 
    picker.sourceType = UIImagePickerControllerSourceTypeCamera; 
    picker.allowsEditing = NO; 
    picker.delegate = self; 
    [self presentViewController:picker animated:YES completion:nil]; 
} 

- (void) imagePickerController:(UIImagePickerController *)picker 
    didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info 
{ 
    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

- (void) imagePickerControllerDidCancel:(UIImagePickerController *)picker 
{ 
    [self dismissViewControllerAnimated:YES completion:nil]; 
} 
Verwandte Themen