带有clang的类集群:如何使用`__attribute __((objc_method_family(none)))`?

时间:2012-04-01 16:33:37

标签: xcode warnings automatic-ref-counting clang class-cluster

我想实现一个类集群(使用ARC),但clang阻碍了它。这是一个init方法,它返回另一个类的具体实例 - 这是类簇的重点:

@implementation PlaceholderServer
- (Server *) init {
    MockServer *concreteServer = [[MockServer alloc] init];
    return concreteServer;
}
@end

clang抱怨return声明:

warning: incompatible pointer types returning 'MockServer *__strong' from a function with result type 'PlaceholderServer *' [-Wincompatible-pointer-types]

我理解该警告的原因:init被clang识别为属于init系列方法,这些方法应该返回实现类(或者可能是子类)的实例。在类集群中通常不是这种情况,实例化的实际具体类可以根据条件而变化。

clang提供了一个注释来覆盖方法系列的自动识别:__attribute__((objc_method_family(FAMILLY))),其中familly可以是alloccopyinit,{{1}之一},或mutableCopy。它也可以是new,文档说明如下:"如果family是none,则该方法没有系列,即使它被认为有一个基于其选择器和。类型"

不幸的是,我无法在我的案例中使其发挥作用。如果我将以下声明添加到none

@interface

然后警告不会消失。如果我将该属性添加到实现中:

- (SGIServer *) init __attribute__((objc_method_family(none)));

然后警告不会消失我也会收到错误:

- (Server *) init __attribute__((objc_method_family(none)))
{
    MockServer *concreteServer = [[MockServer alloc] init];
    return concreteServer;
}

如果我同时执行这两项操作,则初始警告不会消失,但我会收到其他警告:

error: method was declared as an 'init' method, but its implementation doesn't match because its result type is unrelated to its receiver type
- (SGIServer *) init __attribute__((objc_method_family(none)))
^

所以我想我错过了一些基本的东西,但是什么?

这是使用Xcode 4.3.2或Xcode 4.4DP2。

1 个答案:

答案 0 :(得分:0)

不应该弄乱属性;你应该可以改为return (id) concreteServer;,它会切换到动态输入。