2013-06-02 56 views
3

在我最新版本的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的事情或東西嗎?

回答

0

這很奇怪。也許是C++ '11 -ism?

通常,運行時使用的編碼字符串被視爲實現細節,並非真正用於此目的。對於相對簡單的用途,它們將工作得很好,但是對於複雜類型,事情很快就會消失。類似地,語言數組作爲傳值參數和/或返回類型通常可以避免超出例如CGRect/NSRect的隱含數組。

正如您發現的,鍵入編碼隨時間而改變,有時系統中的解析器與編譯器生成的編碼之間存在不匹配。 10.8可能會或可能無法解析。

相關問題