Frage

Hallo, ich bin ein Weg zu finden Laufzeit Typprüfung oder solche Dinge in Objective-C auf Cocoa zu erzwingen.

Das ist mein Codebeispiel. Ich erwartete Laufzeitfehler über falsche Zuordnung zu Variable ‚b‘. Aber es war nicht. Kompiliert und ohne Fehler ausgeführt.

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

 NSArray* a = [NSArray arrayWithObject: @"TEST"]; 
 NSURL* b = [a objectAtIndex:0]; 

    NSLog(@"Is this URL? %i", [b isKindOfClass:NSURL.class]);
    [pool drain];
    return 0;
}

// Console log after program execution:
// 2010-01-11 10:25:02.948 Type Checking[98473:a0f] Is this URL? 0

überrascht ich es keine Laufzeit ist die Typprüfung wird. Weil ich alle Hochsprachen wie VB verwendet, C #, Java, Actionscript ... Ich weiß nicht, Low-Level-Sprache wie C, so kann ich nicht sicher, ob dies der richtige Weg ist ... Es war wirklich schwer, herauszufinden, warum es keine Kompilierung oder Laufzeitfehler ist. Aber ich bin immer dies als eine natürliche Regel in Echt C Welt zu verstehen. Aber mehr starke Typprüfung wird mir helfen, eine Menge. Auch nur Sitzung in debuggen. Gibt es eine Möglichkeit, dies zu tun?

Und wenn es keine Kontrolle Laufzeittyp ist, welche Art von Codierung und Debug-Strategie habe ich nutzen, um über falsch getippt Werte? Und was ist der Kompromiss zwischen der Laufzeit Typprüfung ist oder nicht?

War es hilfreich?

Lösung

Objective-C hat die Typprüfung Compile-Zeit für die Nachrichten Argumente und Rückgabetypen, aber es ist etwas lockerer als viele andere Sprachen. Ein wesentlicher Unterschied besteht darin, dass Auflistungsklassen wie NSArray und NSDictiomary generisch sind. Sie können jede Art von Objekt in eine NSArray setzen - die Elemente müssen nicht vom gleichen Typ sein. Daher gibt es keine Typ-Überprüfung beim Hinzufügen oder Elemente zuzugreifen.

Es gibt keine Laufzeittypprüfung für die variable Zuordnung. Ich glaube, dass eine Leistung Short-Cut ist. Im Allgemeinen ist es ein Problem, nicht viel. Wenn die falsche Art von Wert einer Variablen zugewiesen wird, wird es schließlich eine Nachricht geschickt bekommen es nicht versteht, was eine ziemlich nützliche Fehlermeldung erzeugt.

Andere Tipps

Nun, es ist die Laufzeittypprüfung, aber es passiert etwas später. Ich nehme an, Sie irgendeine Art von Ausnahme erwarten, wenn Sie versuchen, eine NSString-Instanz in ein NSURL * Variable zu setzen. Stattdessen werden Sie die Ausnahme erhalten, wenn Sie irgendwelche NSURL spezifische Methoden auf Ihrer NSString-Instanz anzurufen versuchen.

Zum Beispiel, wenn Sie [b isFileURL] versuchen erhalten Sie eine Ausnahme erhalten, wie „NSString reagiert nicht auf Wähler‚isFileURL‘“.

Es ist auch wichtig zu verstehen, warum gibt es keine Kompilierung Typüberprüfung in Ihrem Beispiel. Insbesondere ist das Fehlen der Kompilierung Typüberprüfung eine einzigartige und wichtige Eigenschaft des id Typ, der was -objectAtIndex: kehrt NSArray der ist.

Das NSObject Framework oft viel Aufheben tritt auf, wenn der Typ falsch ist, aber Sie können für den Typen manuell überprüfen und eine Ausnahme auslösen:

if (![obj isKindOfClass:SomeObjectClass.class])
  [NSException raise:@"BadTypeException"
    format:@"Bad type at line %d", (int)__LINE__];
[obj xyz];

...

if (![obj conformsToProtocol:@protocol(SomeProtocol)])
  [NSException raise:@"BadTypeException"
    format:@"Bad type at line %d", (int)__LINE__];
[obj abc];

Bearbeiten : Entfernte vorherigen Abschnitt behauptet, dass Anrufe auf nicht existierende Methoden zurückkehren Null oder Nullen; wie Mark Bessey sagt, wird eine Ausnahme (nicht Null zurück) ausgelöst, wenn ein Nicht-Null-Objekt keine Methode implementieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top