如何在协议中发布静态void NSString?

时间:2010-01-27 13:10:42

标签: objective-c cocoa 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();”只增加了错误的数量。简而言之,我在无知的徘徊中徘徊,所有的指导都将受到高度赞赏。

2 个答案:

答案 0 :(得分:2)

在顶层,static表示“不能直接访问此文件(没有指针)”(文件范围)。 extern表示“在某些其他目标文件中定义”。 static extern没有任何意义。这就像要求从另一个类访问私有成员。您不想在此处使用static

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

void *MyErrorDomain = @"MyErrorDomain";

.h

中进行外部声明
extern void *MyErrorDomain;

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

您可以添加constconst …extern const …),但NSString实例是不可变的,因此并非完全必要。您可以将它变成const指针,因此指针不能在运行时直接更改(不会丢弃const ness)。您在定义中一起const void * const MyErrorDomain。只需在声明中以extern作为前缀。

此外,根据您的目的,您可以考虑使用NSString *代替void *

答案 1 :(得分:0)

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

如果需要协议方法返回的自定义数据,则应定义一个提供数据的类,并使用该协议所需的方法之一返回该类的实例。这将迫使那些实现协议的人#import这个类。