2012-04-24 64 views
0

我创建了一个宏来定义字符串属性预处理不允许“:”在令牌宏来定义属性

#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. 

是否有可能使用预处理器生成选择器名称?

回答

0

只是不粘贴:,就像这样:

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

还要注意的是字符串应该被定义为copy性质,不strong。 “

+0

_”字符串应该被定义为'copy'属性,而不是'strong'“_真的吗?为什么?找不到任何文件提示这一点。 – 2012-04-24 19:20:24

+0

@QwertyBob只是因为'NSString'有一个可变的子类,你永远不知道你是否传递了一个可变的字符串而不是一个不可变的字符串,并且字符串可能会在没有通知的情况下改变。 – 2012-04-24 19:44:13

+1

这篇文章很好地解释了它(虽然它使用了旧的,ARC之前的保留/发布命名法):http://stackoverflow.com/questions/387959/nsstring-property-copy-or-retain – 2012-04-24 19:46:39