2

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

#define kUpdateTeamNotification CFSTR("kUpdateTeamNotification")

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

[[NSNotificationCenter defaultCenter] postNotificationName:kUpdateTeamNotification object:team];

我收到不兼容的指针类型警告。我当时的印象与字符串CFSTR基本相同。@""我的理解错了吗?

4

1 回答 1

6

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

以下是如何使用桥接演员表

[[NSNotificationCenter defaultCenter] postNotificationName:(__bridge NSString *)kUpdateTeamNotification object:team];

更多关于桥接演员的信息可以在这里找到:NSString to CFStringRef and CFStringRef to NSString in ARC?


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

所以你的常数会变成

头文件 (.h)

FOUNDATION_EXPORT NSString *const kUpdateTeamNotification;

实施文件 (.m)

NSString *const kUpdateTeamNotification = @"kUpdateTeamNotification";
于 2013-10-17T17:22:26.213 回答