EXC_BAD_ACCESS nach Bearbeitung eines Strings mit Leerzeichen?!

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

  • EXC_BAD_ACCESS nach Bearbeitung eines Strings mit Leerzeichen?!

    Hallo zusammen,

    erstmal ein großes Lob für das Forum hier! Hab hier schon das eine oder andere Mal als "passiver" User Lösungen gefunden!

    Zum meinem Problem, ich hab ne "Utility"-Application, in der in der Flipside-View ein String eingelesen wird, der auf der MainView ausgegeben wird.
    Funktioniert soweit, bis ich einen String mit Leerzeichen eingebe - die App ist gekillt, in der Konsole heißt es "Program received signal: “EXC_BAD_ACCESS”.
    kill"


    Code:
    FlipsideViewController.m


    Quellcode

    1. #import "FlipsideViewController.h"
    2. @implementation FlipsideViewController
    3. @synthesize delegate;
    4. - (void)viewDidLoad {
    5. [super viewDidLoad];
    6. self.view.backgroundColor = [UIColor viewFlipsideBackgroundColor];
    7. }
    8. - (IBAction)done:(id)sender {
    9. [self.delegate flipsideViewControllerDidFinish:self];
    10. }
    11. - (BOOL)textFieldShouldReturn:(id)sender
    12. {
    13. [textKunden resignFirstResponder];
    14. return YES;
    15. }
    16. - (void)textFieldDidEndEditing:(id)sender
    17. {
    18. kunden1 = [textKunden text];
    19. }
    20. -(NSString *) kundenFunc{
    21. return kunden1;//und so weiter, hab dann den Rest einfach übernommen
    Alles anzeigen




    Dann der betreffende Ausschnitt aus MainViewController.m


    Quellcode

    1. - (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller{
    2. [self dismissModalViewControllerAnimated:YES];
    3. NSString *kunden = [controller kundenFunc];
    4. NSLog(@"%@", kunden);
    5. [kLabel setText:kunden];
    6. }




    Hab auch super Dealloc usw, hab irgendwo gelesen das Bad Access häufig was Speicher-Problemen zu tun hat?


    Freu mich auf Eure Antworten bzw. Lösungsvorschläge!


    Schöne Grüße!




  • Urbn schrieb:

    Hab auch super Dealloc usw, hab irgendwo gelesen das Bad Access häufig was Speicher-Problemen zu tun hat?

    Ganz genau.

    Du solltest Setter und Getter für den Kunden nutzen.
    Legs als Instanzvariable an und mach nen @synthesize dazu. ;)
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Urbn schrieb:

    hab irgendwo gelesen das Bad Access häufig was Speicher-Problemen zu tun hat

    Du hast als Anwendung heutzutage nur noch direkten Zugriff auf virtuellen Speicher. Das hat diverse Vorteile, unter anderem, dass für jede Anwendung der Speicherbereich bei genau 0 anfangen kann und von allen anderen getrennt ist.
    Der virtuelle Speicher ist dann weiterhin eingeteilt in sog. "Seiten" (Pages), die sind so (auf dem Mac) 4k gross, wenn ich mich recht erinnere. Wenn Du nach Speicher fragst, also etwa ein [alloc] oder malloc(), bekommst Du immer eine neue Seite für Dich.
    Der Programmcode und Deine Konstanten liegen auch in ihren eigenen Seiten in Deinem virtuellen Speicher.
    Und jetzt kommt der Punkt: Diese Seiten können lesbar, schreibbar und ausführbar sein. Dein Programmcode ist bspw. nur lesbar und ausführbar. Deine Konstanten sind nur lesbar. Und Dein normaler Speicher ist nur lesbar und schreibbar.
    Wenn Du nun diese Zugriffsrechte verletzt, bekommst Du in der Regel eine EXC_BAD_ACCESS.
    Ein gutes und häufiges Beispiel dafür ist die PAGEZERO: Genau die Speicher-Seite, die bei der Adresse 0 beginnt hat den besonderen Namen PAGEZERO und ist lese-, schreib- und ausführungsgeschützt. Die ist sozusagen ein Sicherheitspuffer, weil genau wenn Du versuchst an der
    Adresse 0 (bis ca. 4096) etwas zu lesen, etwa Zugriff auf ein Array oder Objekt, was nil/NULL ist, landest Du in der PAGEZERO. Die darfst Du nicht lesen (oder schreiben), darum gibt es dann den EXC_BAD_ACCESS.

    Das gleiche passiert dann (oder kann passieren), wenn Du auf andere Speicherbereiche zugreifen willst, auf die Du nicht zugreifen darfst. Das passiert etwa, wenn ein Bereich wieder freigegeben wurde, Du aber immer noch darauf zugreifst.
    Oder wenn Du Dich mit irgendwelchen Indizes verrechnet hast (hier gibt es keine ARRAY_INDEX_OUT_OF_BOUNDS_EXCEPTION). Oder häufig das schlimmste: Wenn Du aus welchen Gründen auch immer in fremden Speicher geschrieben hast, dabei versehentlich einen Pointer überschrieben hast, der nun irgendwohin ganz anderes (falsches) zeigt. Solche Fehler sind sehr fies zu finden, aber leider gar nicht so selten.

    So, genug "Hintergrund zu EXC_BAD_ACCESS", ich hoffe, es war etwas interessant und vielleicht sogar hilfreich ;)
    C++
  • Lucas de Vil schrieb:

    Du solltest Setter und Getter für den Kunden nutzen.
    Legs als Instanzvariable an und mach nen @synthesize dazu.

    Danke für die schnellen Antworten!
    Hab das jetzt so gemacht:

    Quellcode

    1. @interface FlipsideViewController : UIViewController {
    2. IBOutlet UITextField *textKunden;
    3. id delegate;
    4. NSString *kunden1;
    5. }
    6. @property (nonatomic, assign) id delegate;
    7. @property(readwrite, assign) NSString *kunden1;
    8. - (IBAction)done:(id)sender;
    Und so weiter

    und halt im .m-file

    Quellcode

    1. @synthesize kunden1


    und halt im MainView so:

    Quellcode

    1. [kLabel setText:controller.kunden1];


    Funktioniert Prima, solange ich kein leerzeichen benutze :-/

    zerm schrieb:

    Solche Fehler sind sehr fies zu finden, aber leider gar nicht so selten.
    Das klingt ja sehr fies … Kann man das zum Beispiel mit Instruments überprüfen?
    Ist ja nicht so, dass ich generell irgendwie was bereits freigegebene verwende; das problem tritt ja nur beim Leerzeichen auf… Aber trotzdem danke für deinen sehr ausführlichen Post!
  • Urbn schrieb:

    Funktioniert Prima, solange ich kein leerzeichen benutze :-/

    Das kann ich ehrlich gesagt nicht glauben, dass es ohne Leerzeichen funktioniert. Du hast die Speicherverwaltung noch nicht verinnerlicht.

    [textKunden text]

    gibt Dir eine autoreleastes Objekt zurück. Wenn Du das nicht retainst oder kopierst, dann greifst Du früher oder später ins Leere und bekommst eben diesen EXC_BAD_ACCESS.

    Michael
  • Michael schrieb:

    Das kann ich ehrlich gesagt nicht glauben, dass es ohne Leerzeichen funktioniert. Du hast die Speicherverwaltung noch nicht verinnerlicht.
    Doch, eigentlich schon … Habs einfach verpennt! Total übersehen. Danke nochmal. Hat aber vorher trotzdem Funktioniert ;)

    Lucas de Vil schrieb:

    Solange du wo kein Leerzeichen benutzt? 8|
    Na bei der Eingabe ins TextField.

    Hat sich aber jetzt erledigt, mit Michaels Hinweis läuft das ganze wie geschmiert!

    Danke an alle für die schnellen und hilfreichen Antworten!