在我最新版本的XCode(4.6.2)中,事實證明可以使用C數組類型作爲Objective-C方法的參數類型和返回類型:Objective-C方法的C數組參數和返回類型
@interface Foo : NSObject
@end
@implementation Foo
+ (float[2])bar:(int[4])x { // takes an array of 4 ints, and returns an array of 2 floats
return (float[2]){ x[0] + x[1], x[0] - x[1] };
}
@end
這是出人意料的,因爲ç具體不允許陣列類型作爲參數類型和返回一個C函數的類型(它自動將它們視爲指針類型,而不是)。這意味着Objective-C方法不是C函數的語法糖嗎?
這是否記錄在任何地方?我似乎無法找到任何。
使用上面的代碼,它似乎正常工作:
int qux[4] = {1, 2, 3, 4};
float *baz = [Foo bar:qux];
NSLog(@"%f %f", baz[0], baz[1]); // prints 3.000000 -1.000000
進一步調查此方法的類型信息;顯然有數組類型的新型的編碼語法:
Method method = class_getClassMethod([Foo class], @selector(bar:));
NSLog(@"%s", method_getTypeEncoding(method)); // prints [2f][email protected]:8[4i]16
NSLog(@"%s", @encode(float[2])); // prints [2f]
然而,似乎我的可可(我使用的是Mac OS X 10.7)還沒有認識到這種類型的編碼。下面拋出NSInvalidArgumentException
,原因是:+ [NSMethodSignature signatureWithObjCTypes:]:不支持的返回類型編碼規範 '[2樓]'
[Foo methodSignatureForSelector:@selector(bar:)];
這是一個新的Mac OS X 10.8的事情或東西嗎?