Xcode 10.2 Compiler/Objective-C Runtime defekt?

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

Macoun 2019 - Frühbucherrabatt bis 26.7.2019

  • Xcode 10.2 Compiler/Objective-C Runtime defekt?

    Ich habe eine macOS App in Objective-C die sich mit Xcode 9.2 problemlos übersetzen und ausführen lässt.

    In dieser App verwende ich performSelector:withObject: zum Aufruf einer Klassen Methode. Die aufgerufene Methode hat einen Rückgabewert vom Typ BOOL und der Aufruf der Methode boolValue auf das zurückgegebene Objekt liefert passend YES/NO zum Rückgabewert der Methode.

    Der verwendete Code sieht aktuell in etwa so aus:

    C-Quellcode

    1. BOOL ok = NO;
    2. Class class = [EineKlasse class];
    3. id result = [class performSelector:@selector(validateParameter:) withObject:parameter];
    4. if ([result boolValue])
    5. ok = YES;
    Unter Xcode 9.2 kompiliert funktioniert dies alles wunderbar.

    Wenn ich den gleichen Source Code jedoch unter Xcode 10.2 übersetze, dann gibt es bei Zeile 4 eine EXC_BAD_ACCESS (code=1, address=0x18) Exception. ?(

    Mit Xcode 9.2 übersetzt scheint der Rückgabewert vom Typ NSAtom zu sein, wobei ich eigentlich NSNumber erwartet hätte. Die Methode boolValue scheint es bei NSAtom jedoch zu geben und es wird auch der korrekte Wert YES oder NO zurückgegeben.

    Mit Xcode 10.2 zeigt mir der Debugger jedoch verschiedene Klassen von id, über NSIndexPath, NSTaggedDate, bis NSAtom an. Es ist schon seltsam, dass Objekte verschiedener Klassen zurückgegeben werden, obwohl die aufgerufene Klassenmethode immer nur BOOL zurück liefert. Blöd ist jedoch, dass es in Zeile 4 eigentlich immer eine Exception gibt und der Code, der mit Xcode 9.2 übersetzt noch problemlos funktioniert, unter Xcode 10.2 seinen Dienst verweigert.

    Wie kann ich mit Xcode 10.2 dynamisch eine Klassenmethode aufrufen und den Rückgabewert vom Typ BOOL korrekt auswerten?
  • Mac & i Test Abo
  • Keine Ahnung was performSelector mit einem BOOL, Nicht-Object, als Rückgabewert macht? - Wird das in ein NSValue gewandelt, kommt ein BOOL zurück, oder???



    Das stand in einer alten Doku von Apple drinnen. Keine Ahnung ob das für 10.2 gültig ist. Die aktuelle Doku sagt ja nichts darüber aus.

    Apfel schrieb:

    Note: performSelector: and its companion methods return an object of type id. If the method that’s performed returns a different type, it should be cast to the proper type. (However, casting doesn’t work for all types; the method should return a pointer or a type compatible with a pointer.)

    Vllt. gibt der Xcode 10.2 Debugger verschiedene Typen zurück, da id als NSObjekt und nicht als BOOL interpretiert wird?