我想定义一些常量,并考虑使用#define
构造,如下所示:
#define kUpdateTeamNotification CFSTR("kUpdateTeamNotification")
我的问题是,当我去使用它时:
[[NSNotificationCenter defaultCenter] postNotificationName:kUpdateTeamNotification object:team];
我收到了一个不兼容的指针类型警告。我的印象CFSTR
基本上与@""
字符串相同。我理解错了吗?
答案 0 :(得分:6)
CFString
和NSString
是toll-free bridged因此它们是相同的。 (CFSTR
是用于创建CFString
)的宏。但是,由于指针具有不同的类型,因此必须向编译器明确地发出此信号。此外,在ARC中,当您跨越对象和C结构之间的边界时,您将不得不使用桥接演员。
以下是您如何使用桥接演员
[[NSNotificationCenter defaultCenter] postNotificationName:(__bridge NSString *)kUpdateTeamNotification object:team];
有关桥接演员的更多信息,请访问:NSString to CFStringRef and CFStringRef to NSString in ARC?
但是,您可能希望使用NSString
字面而不是CFStringRef
,也可以使用NSString *const
(如Constants in Objective-C中所述)而不是#define
{1}}。
所以你的常数会变成
FOUNDATION_EXPORT NSString *const kUpdateTeamNotification;
NSString *const kUpdateTeamNotification = @"kUpdateTeamNotification";