【发布时间】:2008-11-23 15:17:39
【问题描述】:
我有一个带有 (id) 参数的 init 方法:
-(id) initWithObject:(id) obj;
我试着这样称呼它:
[[MyClass alloc] initWithObject:self];
但 XCode 抱怨该参数是“不同的 Objective-C 类型”(这通常表示类型不匹配或间接错误级别)。
如果我明确地将 self 转换为 (id),警告就会消失。在任何一种情况下,代码都会按预期运行。 有趣的是,在下一行中,我将 self 传递给另一个也采用 id 的方法,并且效果很好。
我想知道我是否遗漏了一些微妙的东西 - 还是编译器的特殊性?
在我确定有必要使用它的原因之前,我不太愿意直接施放它。
[编辑]
有人要求我提供更多代码。不确定还有很多其他相关的。这是我进行调用的实际代码。请注意,它本身位于 init 方法中。是对initWithSource 的调用发出警告:
-(id) initWithFrame:(CGRect) frame
{
self = [super initWithFrame: frame];
if( self )
{
delegate = nil;
touchDelegate = [[TBCTouchDelegate alloc] initWithSource:self];
[touchDelegate.viewWasTappedEvent addTarget: self action:@selector(viewWasTapped:)];
}
return self;
}
下面是被调用的 init 方法:
-(id) initWithSource:(id) sourceObject
{
self = [super init];
if (self != nil)
{
// Uninteresting initialisation snipped
}
return self;
}
【问题讨论】:
-
您可能想在此处发布更多代码;什么都没有跳出来,但只有两条线可以使用,很难说。
-
同意 Ben 的观点,但要考虑的一件事是声明了 initWithObject 方法吗?
-
感谢收看,伙计们。为了它的价值,我在上面添加了更多代码。 @Jason:是的,头文件中声明了 initWithSource (我的实际方法名称),它肯定匹配。
-
哦,为了抢占您的下一个问题 - 是的,我在进行调用的文件中包含该标题 ;-)
-
您可以创建一个“干净”的例子,而不是使用您现有的项目吗?当我尝试这样做时,我有时会发现问题:)
标签: objective-c casting initialization