UIImagePickerController liefert nil UIImage von Kamera

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • UIImagePickerController liefert nil UIImage von Kamera

    Hallo zusammen

    Bin im Moment mit einem etwas verwirrenden Problem konfrontiert. Meine iPhone 4.3.x App nutzt ein UIImagePickerController um Fotos aus der Library oder direkt von der Kamera auszuwählen.
    Aus der Library funktioniert alles immer einwandfrei, egal ob Simulator oder Hardware. Jedoch das aufnehmen von live Fotos funktioniert auf dem iPhone nur bedingt. Ich erhalte manchmal eine Memory Warnung. Wenn ich alle aktiven Apps schliesse, dann geht es 100% mit dem aufnehmen von Fotos. Und dann, wenn ein paar Apps offen sind, gehts wieder nicht. UIImagePickerController liefert dann ein nil UIImage. Aber wie erwähnt, das auswählen aus der Library funktioniert immer.

    Irgendwelche Tips?
    Ich hab auch schon einen Blog Beitrag dazu geschrieben, da ich auf einigen Seite gelesen habe, dass dies ein iOS Bug ist... Aber allmählich glaube ich irgendwie nicht mehr daran...

    Blog Beitrag: tspycher.com/bad-uiimagepickercontroller/

    Mein Code:

    Quellcode

    1. -(void)viewDidLoad
    2. {
    3. self.imgPicker = [[UIImagePickerController alloc] init];
    4. self.imgPicker.allowsImageEditing = YES;
    5. self.imgPicker.delegate = self;
    6. self.imgPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    7. }
    8. -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
    9. {
    10. dispimage = [[info objectForKey:UIImagePickerControllerOriginalImage]retain];
    11. [picker dismissModalViewControllerAnimated:YES];
    12. }
    13. -(IBAction)open
    14. {
    15. if(self.imgPicker == nil)
    16. {
    17. self.imgPicker = [[UIImagePickerController alloc] init];
    18. self.imgPicker.allowsImageEditing = YES;
    19. self.imgPicker.delegate = self;
    20. self.imgPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    21. }
    22. [self presentModalViewController:self.imagePicker animated:YES];
    23. [self.imagePicker release];
    24. }
    25. -(IBAction) print
    26. {
    27. if(dispimage != nil)
    28. {
    29. imageView.image=dispimage;
    30. }
    31. };
    Alles anzeigen
    Coding: code.zero-one.ch

    Personal
    =======
    WWW: spychernet.com
    Twitter: twitter.com/omnibyte
  • Du hast da mehrere Fehler in Deinem Programm:
    1. In viewDidLoad solltest Du die Methode in der Oberklasse aufrufen.
    2. self.imgPicker = [[UIImagePickerController alloc] init]; erzeugt ein Speicherleck.
    3. Die Zeile [self.imagePicker release]; ist übrigens extrem böse, da Sie einen Dangling Pointer erzeugt. Wenn Du eine Property freigeben willst, solltest Du sie einfach auf nil setzen.
    4. Den If-Block (Zeile 16 bis 20) kannst Du Dir sparen, da der Image-Picker ja schon in viewDidLoad initialisiert wird.
    5. dispimage erzeugt wahrscheinlich auch ein Leck. Du solltest dafür auch eine (retained) Property verwenden.
    „Meine Komplikation hatte eine Komplikation.“
  • Wau, merci für die schnelle Antwort.

    Der oben gepostete Code entspricht nicht genau dem Code, den ich in der App verwendet habe. Er ist dort auf das wesentliche reduziert. Aber ich habe deine Hinweise eben umgesetzt und teste mal... Schonmal herzlichen Dank!!!

    Aber worum erzeugt self.imgPicker = [[UIImagePickerController alloc] init]; ein Speicherleck?
    Coding: code.zero-one.ch

    Personal
    =======
    WWW: spychernet.com
    Twitter: twitter.com/omnibyte
  • omnibyte schrieb:

    Aber worum erzeugt self.imgPicker = [[UIImagePickerController alloc] init]; ein Speicherleck?

    Wenn imgPicker eine retained Property ist, dann fehlt dem ImagePicker ein (Auto-)Release. Eine retained Property sendet bei der Zuweisung selber ein Retain an den neuen und ein Release an den alten Wert. Eine Property vom Typ assign oder gar copy macht hier keinen Sinn, da die Property den Wert halten muss.

    Du solltest niemals die Speicherverwaltung für eine Property übernehmen. Das macht die selber und zwar genau so, wie Du es in der Deklaration festlegst. Aus diesem Grund solltest Du auch niemals retain, release oder autorelease an eine Property senden. Wenn Du den Wert einer Property freigeben willst, solltest Du ihr den Wert nil zuweisen.

    Lies mal: developer.apple.com/library/io…_ref/doc/uid/20000043-SW1, developer.apple.com/library/io…ef/doc/uid/TP40004447-SW1 und developer.apple.com/library/io…c/uid/TP30001163-CH17-SW1
    „Meine Komplikation hatte eine Komplikation.“