Objective c 如何在协议中发布静态无效NSString?

Objective c 如何在协议中发布静态无效NSString?,objective-c,cocoa,xcode,Objective C,Cocoa,Xcode,我已经定义了一个自定义错误域,要在协议中发布该域。域在实现文件中定义如下: //in the .m file static void *MyErrorDomain = (void *)@"MyErrorDomain"; .h文件实现了一个协议,我也想在那里发布MyErrorDomain。然而,我想不出正确的形式。误差最小的是: // in the protocol static extern void * TBPluginErrorDomain; Xcode错误是:“声明说明符中有多

我已经定义了一个自定义错误域,要在协议中发布该域。域在实现文件中定义如下:

//in the .m file
static void *MyErrorDomain = (void *)@"MyErrorDomain";
.h文件实现了一个协议,我也想在那里发布MyErrorDomain。然而,我想不出正确的形式。误差最小的是:

// in the protocol    
static extern void * TBPluginErrorDomain;
Xcode错误是:“声明说明符中有多个存储类”


我认为静态void构造将MyErrorDomain变成了一种函数,但是“static extern void TBPluginErrorDomain();”只会增加错误的数量。简言之,我正徘徊在无知的泥潭中,所有的指导都将受到极大的赞赏。

协议只定义了将由其他类实现的方法的名称和参数。它们不包含任何数据或功能代码


如果希望协议方法返回自定义数据,则应定义一个提供数据的类,并让协议的一个必需方法返回该类的实例。这将迫使那些实现该协议的人#导入该类

在顶层,
静态
表示“无法直接访问(没有指针)此文件之外的文件”(文件范围)<代码>外部表示“在其他对象文件中定义”<代码>静态外部实际上没有任何意义。这就像请求访问另一个类的私有成员一样。您不想在此处使用
静态

只需在
.m
中创建一个正常的定义:

void *MyErrorDomain = @"MyErrorDomain";
并在
.h
中进行外部声明:

extern void *MyErrorDomain;
当您链接使用变量的内容时(包括
.h
文件后),请确保从
.m
链接
.o
。在Xcode中,在
.m
文件的“获取信息”窗口的“目标”选项卡中,确保检查使用该变量的每个目标(在较新版本中可能略有不同,我的是旧的!)

您可能可以添加
const
const…
extern const…
),但是NSString实例是不可变的,所以它不是完全必要的。不过,您可以将其变成
const
指针,这样就不能在运行时直接更改指针(而不丢弃
const
属性)。定义中有
const void*const MyErrorDomain
。只需在声明中给它加上
extern


此外,根据您的目的,您可以考虑使用<代码> NSCORST*<代码>而不是<代码> Value*/Cux> ./P>什么使您认为我试图将数据或函数代码包含在协议中?我已经编辑了我的问题,以显示我在实现文件中放了哪行代码,在协议中放了哪行代码。因为您说过要在协议中发布错误域。协议没有实现文件。协议只是

@protocol…@end
之间的方法声明。您根本不能在协议中“发布”任何变量。我想你可能把协议和接口混淆了。啊,我想我们对“发布”这个词有不同的解释。我的意思是“让全世界都知道它的存在”,你把它理解为“提供价值”。有趣的是,Merriam-Webster的在线词典似乎同时支持这两种含义[www.Merriam-Webster.com/Dictionary/publish]。不必担心未来,不必担心。我实现了您的解决方案,但不幸的是,我现在遇到了错误“MyErrorDomain的冲突类型”。我已经读到,(void*)指针将自动转换到正确的类型,这相当令人费解。“冲突类型”错误意味着定义或声明中有额外的内容(或缺少内容)。将其中一个复制并粘贴到另一行之前的一行,然后凝视并比较,或者只是将定义类型替换为声明类型(不带
extern
)。凝视并比较?这对一家公司来说是个好名字,但太多的诚实可能不起作用。无论如何,一个项目范围内的发现表明,我已经在其他地方将MyErrorDomain定义为NSString常量。请问您为什么更改了void*MyErrorDomain=(void*)@“MyErrorDomain”;要作废*MyErrorDomain=@“MyErrorDomain”?关于NSString*vs void*:(void*)是StackOverflow上的某个人权威性地声明的通过引用传递和比较常量的正确方法(如上下文==&MyModuleObservationContext)。在指针和内存管理方面,我很容易给人留下深刻印象。在C语言中,当您提供或需要另一种指针类型时,对void*的转换是自动的。有关支持和反对在C中包含强制转换的参数(在C++中是必需的),请参阅。