铿锵声3中不再需要消息和函数原型吗?

时间:2012-03-28 15:54:17

标签: objective-c xcode warnings llvm clang

我希望以下代码产生关于隐式声明函数的警告:

@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

具体来说,我希望在声明之前警告有关同时使用barbaz的警告。 (bar将被视为返回idbaz将被视为返回int。)

GCC显示两个警告,LLVM的Clang 2.9也是如此。然而,Clang 3显然可以发现barbaz存在以及它们返回的内容。 不显示警告(除非删除了这些功能)。

(当在类之外声明baz时,仍会出现警告。所以这只适用于Objective-C!)

太棒了!这样可以删除大量重复内容。但是发生了什么?这是语言扩展吗?它是编译器功能吗?这是一个错误吗?或者我错了吗?我找不到任何关于此的文档,所以我很谨慎依赖它。 有人有任何见解吗?

2 个答案:

答案 0 :(得分:2)

iOS 6文档(现在出自NDA)最终包含对此功能的正式确认。

它被称为“@implementation block中不需要前向方法原型”,需要Xcode 4.3 (LLVM编译器3.1)并且与所有iOS版本兼容。

Objective-C Feature Availability Index

该页面列出了编译器和Objective-C的最新改进以及它们可用的constellatons。

答案 1 :(得分:1)

几周前苹果公司的名单上出现了这个问题。这是一个新功能。还有一些其他的事情发生了:

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

作为

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

(嗯,这不是一个直接的翻译)。

另外,我认为会有

array[i]

代表

[array objectAtIndex: i];

并且字典会有相应的扩展名。