NSMutableArray / NSAttributedString BAD ACCESS

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

  • NSMutableArray / NSAttributedString BAD ACCESS

    Hallo Leute,

    folgende Methode crashed seit iOS 9 "zufällig" mit EXC_BAD_ACCESS code=1. Vielleicht bei jeden 15. Aufruf oder so und zwar bei der Zeile 11.

    Quellcode

    1. - (void) cacheSysTitles: (NSArray *) items
    2. {
    3. sysTitles = [NSMutableArray new];
    4. for(NSDictionary *dic in items)
    5. {
    6. NSString *val = [NSString stringWithFormat:@"%@", [dic valueForKey:@"name"]];
    7. val = [StringHelper appendStrings:@"<span style=\"font-size: 22px; font-family: 'HelveticaNeue'; color: #05355B;\">", val, @"</span>", nil];
    8. [sysTitles addObject:[[NSAttributedString alloc] initWithData:[val dataUsingEncoding:NSUTF8StringEncoding] options:@{NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType, NSFontAttributeName: @"HelveticaNeue"} documentAttributes:nil error:nil]];
    9. }
    10. }
    Alles anzeigen

    Im Debugger haben "items" 62 Objekte, "val" hat einen Wert, dic hat 10 ValueKeyPairs und SysTitles zum Zeitpunkt des Crashes auch 62 Objekte.
    Methode wird im Mainthread aufgerufen.

    Warum? :(
    Every language has an optimization operator. In ObjC that operator is ‘//’.

    golbros.de
  • Fortrackz schrieb:

    Im Debugger haben "items" 62 Objekte, "val" hat einen Wert, dic hat 10 ValueKeyPairs und SysTitles zum Zeitpunkt des Crashes auch 62 Objekte.
    Davon ausgehend, dass die Methode an sich korrekt läuft (Unit Tests?) kann das eigentlich nur bedeuten, dass da was falsch läuft.
    Wenn items 62 Einträge hat und sysTitles ebenfalls 62 Einträge, dann muss ja logischerweise versucht werden einen 63ten Eintrag hinzuzufügen.

    Vielleicht macht auch dieses 'StringHelper' Dings da Murks.
    Hast Du das mal testweise gegen [NSString stringWithFormat:…] getauscht?
    «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

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Marco Feltmann ()

  • Hier auch gerne die StringHelper Methode.

    Die habe ich lediglich weil mit das mit appendStringByString oder wie die heitß einfach zu unübersichtlich wird..

    C-Quellcode

    1. + (NSString *) appendStrings:(NSString *)string, ... NS_REQUIRES_NIL_TERMINATION;
    2. {
    3. NSMutableString *appendedString = [NSMutableString string];
    4. if(string)
    5. [appendedString appendString:string];
    6. va_list args;
    7. va_start(args, string);
    8. id arg = nil;
    9. while((arg = va_arg(args, id)))
    10. {
    11. if(arg)
    12. [appendedString appendString:arg];
    13. }
    14. va_end(args);
    15. return appendedString;
    16. }
    Alles anzeigen

    @nussratte: Habe ich nun gemacht und werde nun auf den Fehler warten. :D
    Every language has an optimization operator. In ObjC that operator is ‘//’.

    golbros.de
  • Aua.
    [NSString stringWithFormat:@"<span style=\"font-size: 22px; font-family: 'HelveticaNeue'; color: #05355B;\">%@</span>", val];
    Nix mit Unübersichtlich.

    Ich kann mir zwar nicht direkt vorstellen, dass das irgendwas damit zu tun hat, aber der zeitliche, prozessor– und speicherlastige Overhead für so einen winzigen String via NSMutableString dürfte schon beachtlich sein.
    «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
  • Fortrackz schrieb:

    Erinnert mich mehr an die übliche Vorgehensweise anderer Programmiersprachen.

    String s = string1 + string2;

    Und was wäre String s = string1 - string2;?
    «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
  • Marco Feltmann schrieb:

    Fortrackz schrieb:

    Erinnert mich mehr an die übliche Vorgehensweise anderer Programmiersprachen.

    String s = string1 + string2;
    Und was wäre String s = string1 - string2;?
    Naja, Strings sind halt Monoide und keine Gruppen. ;) Aber richtig, Operator-Overloading führt halt schnell zu Missverständnissen. Was ist z. B.: 3 + "5" oder "3" + 5?
    „Meine Komplikation hatte eine Komplikation.“
  • Hallo Leute,

    die Methode sieht nun so aus:

    [Blockierte Grafik: http://abload.de/img/bildschirmfoto2015-10u6r1g.png]


    Und folgender Fehler steht in der Konsole:

    Quellcode

    1. *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 3 beyond bounds for empty array'
    2. *** First throw call stack:
    3. (0x182154f5c 0x196d4bf80 0x18203af68 0x100049718 0x187e86fa0 0x18770ea38 0x187709b6c 0x1876a6ff0 0x186eadf14 0x186ea8b20 0x186ea89e0 0x186ea807c 0x186ea7dd0 0x186ea14bc 0x18210bc30 0x1821099d4 0x182038de0 0x193154f6c 0x193156248 0x1930f6b50 0x1930f5628 0x10004388c 0x100044f48 0x100053494 0x1001c9d70 0x1001c9d30 0x1001cf780 0x18210c258 0x18210a0c0 0x182038dc0 0x18d18c088 0x187712f44 0x1000ac6c4 0x1975768b8)
    4. libc++abi.dylib: terminating with uncaught exception of type NSException
    So sehen die Variablen aus:

    [Blockierte Grafik: http://abload.de/img/bildschirmfoto2015-10ugq3z.png]



    in dem Dictionary für den Key "name" steht beim Absturz: "BLABLA<b><i>SoWichtigerKursiverText</i></b>"

    Wieso bringt er eine NSArray Exception wenn ich ein NSAttributedString erstelle? Und das nur zu unbestimmten Momenten.
    Every language has an optimization operator. In ObjC that operator is ‘//’.

    golbros.de
  • Folgende Idee: Erzeuge erst mal ein neues MutableArray und weise das dann Schluss deinem Zeiger auf sysTitles zu, statt gleich am Anfang sysTitles neu zu belegen. Also wie im folgenden Code-Schnipsel


    C-Quellcode

    1. - (void)cacheSysTitles:(NSArray*)items
    2. {
    3. NSMutableArray *newSysTitles = [NSMutableArray new];
    4. // ... newSysTitles befüllen
    5. sysTitles = newSysTitles;
    6. }
    Denn die Fehlermeldung ist ja schon ein starkes Indiz dafür, dass mein Zugriff auf ein MutableArray was schief läuft -- und so viele sind das ja nicht ;)
  • Dass der Crash vom Debugger in einer anderen Zeile angezeigt wird habe ich schon gesehen. Die Fehlermeldung passt aber nicht sonderlich gut zur Erzeugung eines NSAttributedString - sondern schon eher zu der Zeile dahinter ... und du suchst ja nach Ansätzen um dein Problem zu lösen, die Du womöglich nicht siehst.

    Mein Änderungsvorschlag ist auch nicht sehr kompliziert und aufwändig in der Umsetzung.

    Also - probier es doch einfach mal und gib dann Bescheid ob der Fehler immer noch (gleich häufig) auftaucht.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Frank_in_HD () aus folgendem Grund: typo

  • 1. Bitte setze den Code doch in Code-Tags und paste ihn nicht als Bild.

    2. documentAttributes: sollte NULL sein, nicht nil. Hat aber nichts mit deinem Problem zu tun.

    3. Nimm mal testweise als Dokumententyp Plain-Text.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?