我想实现一个类集群(使用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可以是alloc
,copy
,init
,{{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。
答案 0 :(得分:0)
不应该弄乱属性;你应该可以改为return (id) concreteServer;
,它会切换到动态输入。