代码之家  ›  专栏  ›  技术社区  ›  Elise van Looij

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

  •  0
  • Elise van Looij  · 技术社区  · 14 年前

    我定义了一个自定义错误域,希望在协议中发布它。域在实现文件中定义如下:

    //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 回复  |  直到 14 年前
        1
  •  2
  •   Chris Johnsen    14 年前

    在最高层, static 表示在文件范围之外不能直接访问(没有指针)。 extern 表示在其他对象文件中定义的__。 static extern 没有任何意义。这就像从另一个类请求访问私有成员一样。你不想用 静止的 在这里。

    只需在你的 .m :

    void *MyErrorDomain = @"MyErrorDomain";
    

    并在你的 .h 以下内容:

    extern void *MyErrorDomain;
    

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

    您可能可以添加 const ( const … extern const … ,但nsstring实例是不可变的,因此不是完全必要的。你可以把它变成 康斯特 但是指针,因此在运行时无法直接更改指针(不丢弃 常量 尼斯)你们在一起 const void * const MyErrorDomain 在定义中。在它前面加上前缀 外部的 在声明中。

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

        2
  •  0
  •   TechZen    14 年前

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

    如果您希望由协议方法返回自定义数据,那么应该定义一个提供数据的类,并让协议所需的方法之一返回该类的实例。这将强制那些实现协议的人导入类。