Objective c 预处理器不允许宏中的令牌中的“:”定义属性

Objective c 预处理器不允许宏中的令牌中的“:”定义属性,objective-c,xcode,clang,c-preprocessor,selector,Objective C,Xcode,Clang,C Preprocessor,Selector,我创建了一个宏来定义字符串属性 #define STRING_PREF(NAME) \ @property (nonatomic, strong, getter=NAME, setter=set_##NAME##:) NSString * NAME; 我试着这样使用它: STRING_PREF(username) 但最终会出现以下错误: error: pasting formed 'set_username:', an invalid preprocessing token STRING_

我创建了一个宏来定义字符串属性

#define STRING_PREF(NAME) \
 @property (nonatomic, strong, getter=NAME, setter=set_##NAME##:) NSString * NAME;
我试着这样使用它:

STRING_PREF(username)
但最终会出现以下错误:

error: pasting formed 'set_username:', an invalid preprocessing token
STRING_PREF(username)
^
foo.h:16:62: note: expanded from macro 'STRING_PREF'
        @property (nonatomic, strong, getter=NAME, setter=set_##NAME##:)        NSString * NAME;
                                                                    ^
1 error generated.
无法使用预处理器生成选择器名称吗?

请不要粘贴:,如下所示:

#define STRING_PREF(NAME) @property (nonatomic, copy, getter=NAME, setter=set_##NAME:) NSString *NAME;

还要注意,字符串应该定义为复制属性,而不是强属性。

字符串应该定义为复制属性,而不是强属性,真的吗?为什么?找不到任何文档表明这一点。@QwertyBob仅仅是因为NSString有一个可变子类,您永远不知道是否以可变字符串而不是不可变字符串传递,并且字符串可能会在未经通知的情况下更改。尽管本文使用了旧的弧前保留/释放术语,但对其进行了很好的解释: