CFStringRef适合常量?

Aar*_*her 2 objective-c

我想定义一些常量,并考虑使用#define构造,如下所示:

#define kUpdateTeamNotification CFSTR("kUpdateTeamNotification")
Run Code Online (Sandbox Code Playgroud)

我的问题是,当我去使用它时:

[[NSNotificationCenter defaultCenter] postNotificationName:kUpdateTeamNotification object:team];
Run Code Online (Sandbox Code Playgroud)

我得到一个不兼容的指针类型警告.我的印象CFSTR基本上与@""字符串相同.我理解错了吗?

Gab*_*lla 6

CFString并且NSString免费的桥接,因此它们是相同的东西.(CFSTR是一个创建的宏CFString).但是,由于指针具有不同的类型,因此必须向编译器明确地发出此信号.此外,在ARC中,当您跨越对象和C结构之间的边界时,您将不得不使用桥接转换.

这是你如何使用桥接演员

[[NSNotificationCenter defaultCenter] postNotificationName:(__bridge NSString *)kUpdateTeamNotification object:team];
Run Code Online (Sandbox Code Playgroud)

有关桥接强制转换的更多信息可以在这里找到:NSString到CFStringRef和CFStringRef到ARC中的NSString?


但是,您可能希望使用NSString文字而不是a,CFStringRef并且还使用a NSString *const(如Objective-C中的常量中所述)而不是a #define.

所以你的常数会变成

头文件(.h)

FOUNDATION_EXPORT NSString *const kUpdateTeamNotification;
Run Code Online (Sandbox Code Playgroud)

实施文件(.m)

NSString *const kUpdateTeamNotification = @"kUpdateTeamNotification";
Run Code Online (Sandbox Code Playgroud)