5

它有什么作用,尤其是##?

#define CUSTOM_ARRAY_INTERFACE(classname) \
@interface classname ## Array : ConcreteMutableArray \
- (void) add:(classname*)obj;\
- (classname*) get:(int)index;\
@end\

那会产生什么CUSTOM_ARRAY_INTERFACE(NSString),我的这个想法甚至都行不通

@interface NSString ## Array : ConcreteMutableArray
- (void) add:(classname*)obj;
- (classname*) get:(int)index;
@end

?

是一种无需查看汇编代码即可显示宏将扩展为哪些代码的方法?

4

2 回答 2

6

##一个宏连接运算符,因此

CUSTOM_ARRAY_INTERFACE(Foo)

将连接FooArray导致

@interface FooArray : ConcreteMutableArray 
- (void) add:(Foo*)obj;
- (Foo*) get:(int)index;
@end

或者

CUSTOM_ARRAY_INTERFACE(NSString)

会导致

@interface NSStringArray : ConcreteMutableArray 
- (void) add:(NSString*)obj;
- (NSString*) get:(int)index;
@end

值得注意的是,Objective-C 现在支持轻量级泛型,不再需要上述模式。例如,NSArray让您指定数组中各个元素的对象类型,例如

NSArray <NSString *> *array = ...

现在编译器知道这array是一个字符串数组,而无需为此声明特定类型。编译器将知道以下内容是有效的:

NSString *string = array[0];

但是,如果您尝试执行以下操作:

NSNumber *number = array[0];

这将导致以下编译时警告:

使用“NSString *”类型的表达式初始化“NSNumber *”的不兼容指针类型。

请注意,这是一个“轻量级”的泛型。例如,它只会导致编译时警告,但不会像其他语言(例如 Swift)中的真正泛型那样在运行时严格执行此操作。

于 2013-09-26T13:20:06.977 回答
4

您可以从 Xcode 菜单通过以下方式查看文件的预处理器输出:

  • Xcode 4.6中:转到“产品”->“生成输出”->“预处理文件”。

  • Xcode 5中:转到“产品”->“执行操作”->“预处理文件”。

对于您的宏示例,它会生成以下代码:

@interface NSStringArray : ConcreteMutableArray 
- (void) add:(NSString*)obj;
- (NSString*) get:(int)index;
@end
于 2013-09-26T13:18:25.313 回答