2012-04-24 12 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

_ "文字列は' strong'ではなく 'copy'プロパティとして定義する必要があります。"どうして?これを示唆する文書は見つかりません。 –

+0

@QwertyBob単純に 'NSString'には変更可能なサブクラスがあるので、あなたが不変のものの代わりにMutableの文字列で渡されたかどうかは分かりません。 –

+1

この記事では、それをうまく説明しています(古いARC保持/リリースの用語を使用していますが)。http://stackoverflow.com/questions/387959/nsstring-property-copy-or-retain –

関連する問題