2012-03-28 7 views
2

Ich erwarte, dass der folgende Code Warnungen über implizite Deklaration von Funktionen erzeugen:Sind in clang 3 Nachrichten- und Funktionsprototypen nicht mehr nötig?

@interface TestClass : NSObject 
@end 

@implementation TestClass 

- (void)foo { 
    NSString *test = [self bar]; 
    NSLog(@"%@", test); 
    test = baz(); 
    NSLog(@"%@", test); 
} 

- (NSString *)bar { 
    return @"bar"; 
} 

NSString *baz() { 
    return @"baz"; 
} 

@end 

Insbesondere würde ich Warnungen erwarten über beide bar und baz verwenden, bevor sie deklariert sind. (bar würde davon ausgegangen werden id zurückzukehren und baz würde davon ausgegangen werden int zurückzukehren.)

GCC zeigt beide Warnungen, wie auch LLVM des Clang 2.9. Clang 3 kann jedoch anscheinend herausfinden, dass bar und baz existieren und was sie zurückgeben. Keine Warnung erscheint (außer die Funktionen werden entfernt).

(Wenn baz außerhalb der Klasse deklariert wird, tritt die Warnung immer noch. Also gilt dies nur für Objective-C!)

Awesome! Das würde eine Menge Duplikate entfernen lassen. Aber was ist los? Ist das eine Spracherweiterung? Ist es ein Compiler-Feature? Ist es ein Fehler? Oder irre ich mich damit? Ich konnte keine Dokumentation darüber finden, daher bin ich vorsichtig, mich darauf zu verlassen. Hat jemand einen Einblick?

+0

Nimm es so wie es ist - super! Jetzt, wenn sie nur LLDB reparieren können .... –

Antwort

2

Die iOS 6-Dokumentation (jetzt aus der NDA) enthält schließlich eine offizielle Bestätigung dieser Funktion.

Es heißt "No Forward-Methode Prototypen benötigt in @ Implementierungs-Block", erfordert Xcode 4.3 (LLVM Compiler 3.1) und ist kompatibel mit allen Versionen von iOS.

Objective-C Feature Availability Index

dieser Seite listet alle jüngsten Verbesserungen an den Compiler und Objective-C und unter welchen constellatons sie verfügbar sind.

1

Dies kam vor ein paar Wochen auf der Apple-Liste. Es ist ein neues Feature. Es gibt einige andere Dinge zusammen wie kommen:

NSArray* myArray = @[ @"foo", @"bar", @"baz"]; 

als syntaktischer Zucker für

NSArray* myArray = [NSArray arrayWithObjects: @"foo", @"bar", @"baz", nil]; 

(gut, es ist nicht ganz direkte Übersetzung).

Außerdem glaube ich, es

array[i] 

für

[array objectAtIndex: i]; 

und es wird für Wörterbücher äquivalente Erweiterungen sein sein wird.

+0

Es gibt einen SO-Post über die literale Syntax: http://stackoverflow.com/questions/9693647/is-there-some-literal-dictionary-or-array-syntax- In-Ziel-c –