MyObject可能无法响应消息'-Foo'。 (Noob)Objective-C问题

时间:2009-06-30 14:46:14

标签: objective-c casting nsmutablearray

另一个C#/。NET的人试图通过iPhone应用程序赚取数百万的梦想来学习Objective-C:)

好的,我确定这个问题源于我习惯于静态类型语言,因此我很难调整,但这是我的问题。我们假设我有一个名为MyObect的类:

MyObject.h

@interface MyObject : NSObject
{

}

-(void)Foo;

@end

MyObject.m

#import "MyObject.h"
@implementation MyObject

-(void)Foo
{
  //do something fooey
}

@end

现在我正在尝试使用这些对象的NSMutableArray,所以在我的主要内容中填充这些对象的数组:

NSMutableArray *array = [[NSMutableArray alloc] init];
for(int i = 0; i<10;i++)
{
   MyObject *obj = [[MyObject alloc]init];
   [array addObject:obj];
}

没什么特别的。然而,现在,我试图拉出数组的第一个,并调用foo方法。所以,这就是我感到困惑的地方。我试过这个:

MyObject *obj = [array objectAtIndex:1];
[obj Foo];

虽然这有效,但我收到一条警告,指出MyObject可能无法响应消息。所以,我想,好吧,让我投吧:

MyObject *obj = (MyObject *)[array objectAtIndex:1];
[obj Foo];

这也给了我警告。

我想我的问题是关于如何在集合中存储项目以及如何将它们拉出并仍然保留对象类型的基本问题。我再次来自.NET背景,所以也许我的想法存在根本缺陷,所以如果有人能指出我正确的方向,我会非常感激。

编辑:我的原始代码确实在演员阵容中有星号(没有它就会出现编译错误)。它仍然显示警告......

3 个答案:

答案 0 :(得分:1)

将您的投射线更改为:

MyObject *obj = (MyObject *)[array objectAtIndex:1];

缺少*是问题所在。

答案 1 :(得分:1)

这不应该发出警告,因为您在另一个答案的评论中包含了您描述的星号。事实上,我认为演员阵容是不必要的 - 即使没有演员阵容的版本也不应该发出警告。

确保头文件MyObject.h在您尝试调用方法的文件的开头#imported。您收到的警告是典型的情况,即您已使用@class MyObject向前声明了一个类,但未包含#import "MyObject.h"的标题。

BTW,在Objective-C中,通常使用小写字母开始方法名称,如Java中那样。

答案 2 :(得分:1)

好吧,我现在感觉像是一个完全白痴:(我忘了将方法声明添加到头文件中。事实上,你们都强调我需要确保我导入头文件,制作我意识到这一点。感谢你们两位的帮助。