objective-c - 如何在协议(protocol)中发布 static void NSString?

标签 objective-c cocoa xcode

我定义了一个自定义错误域,我想在协议(protocol)中发布它。该域在实现文件中定义如下:

//in the .m file
static void *MyErrorDomain = (void *)@"MyErrorDomain";

.h 文件实现了一个协议(protocol),我也想在那里发布 MyErrorDomain。但是,我无法找出正确的形式。错误最少的一个是:

// in the protocol    
static extern void * TBPluginErrorDomain;

Xcode 错误是:“声明说明符中存在多个存储类”。

我认为 static void 构造将 MyErrorDomain 变成了一种函数,但是“static extern void TBPluginErrorDomain();”只增加了错误的数量。简而言之,我正徘徊在无知的泥沼中,非常感谢所有指导。

最佳答案

在顶层,static表示“无法在该文件之外直接访问(没有指针)”(文件范围)。 extern意思是“在其他目标文件中定义”。 static extern确实没有任何意义。这就像请求访问另一个类的私有(private)成员一样。您不想使用static在这里。

只需在 .m 中进行正常定义即可:

void *MyErrorDomain = @"MyErrorDomain";

并在 .h 中做出外部声明:

extern void *MyErrorDomain;

请务必链接到 .o来自.m每当您将使用该变量的内容链接在一起时(在包含 .h 文件之后)。在 Xcode 中,在“获取信息”窗口的“目标”选项卡中查找 .m文件中,请务必检查使用该变量的每个目标(在新版本中可能略有不同,我的是旧版本!)。

您可以添加 const ( const …extern const … ),但 NSString 实例是不可变的,所以它并不是完全必要的。你可以把它变成 const但是指针,因此不能在运行时直接更改指针(不丢弃 const ness)。你们一起拥有const void * const MyErrorDomain在定义中。只需在其前面加上 extern 即可在声明中。

此外,根据您的目的,您可以考虑使用 NSString *而不是void * .

关于objective-c - 如何在协议(protocol)中发布 static void NSString?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2147023/

相关文章:

objective-c - NSSpeechSynthesizer 和轨道持续时间

ios - 是否有一种方法比 NSKeyedArchiver 使用更少的内存来归档对象?

ios - 当 Objective-C 作为桥梁时,快速在索引 0 处发出检查计数

objective-c - 如何以编程方式绑定(bind) NSCollectionView 的 View 子类?

xcode - 为什么 Textmate 不使用典型的 Xcode 项目?

cocoa - 将窗口发送到后面?

xcode - OSX 上的 gcc 在哪里?我已经安装了 Xcode

ios - 是否可以在输出 ".a"库的项目中包含框架?

xcode - macOS 应用程序不能分发 "developer ID"(选项不显示)

ios - 无法将今天的步骤显示到标签中