Objective c ';TileMap';可能不响应'+;地图名称:';

Objective c ';TileMap';可能不响应'+;地图名称:';,objective-c,iphone,xcode,Objective C,Iphone,Xcode,这里有一个奇怪的。我有一个名为TileMap的类,具有以下接口: @interface TileMap : NSObject { int *data; int tilesWide; int tilesHigh; NSString *imageName; } + (id)mapNamed:(NSString *)filename; - (id)initWithFile:(NSString *)filename; @end 实现如下所示: @implementa

这里有一个奇怪的。我有一个名为
TileMap
的类,具有以下接口:

@interface TileMap : NSObject
{
    int *data;
    int tilesWide;
    int tilesHigh;
    NSString *imageName;
}

+ (id)mapNamed:(NSString *)filename;
- (id)initWithFile:(NSString *)filename;

@end
实现如下所示:

@implementation TileMap

+ (id)mapNamed:(NSString *)filename
{
    return [[self alloc] initWithFile:filename];
}

- (id)initWithFile:(NSString *)filename
{
    if (self = [super init])
    {
        // ...
    }
    return self;
}


@end
但是当我添加对
[TileMap mapname:@“map.plist”的调用时到我的应用程序Xcode警告:

“TileMap”可能不响应“+MapName:”

应用程序编译良好,并记录对
TileMap initWithFile:
中的
NSLog
的调用。我注意到这个类和方法的Xcode语法着色是关闭的,所以我尝试分别重命名这个类和方法。消除警告和语法着色问题的唯一组合是重命名类和方法


我是否与一些未记录的框架类或方法发生冲突?“在文档中查找”不会透露任何信息。在项目中查找只显示调用、接口定义和实现。我被难住了(这并不需要太多)。有没有一种方法可以避免使用我现有的命名约定?

您是否导入了TileMap.h标题?您是否保存了TileMap.h头?

结果是,我的项目目录中有两个TileMap.h和TileMap.m文件,在查找程序中可见,但在Xcode中不可见。一个完整的接口和实现,在我的根项目目录中。另一个只是我的框架子目录中的一个裸NSObject子类。我不知道这是怎么发生的。删除后者解决了问题。还是谢谢你的帮助,戴夫。

肖恩

除了您询问的问题之外,您在
+mapNamed:
中还存在内存泄漏。以下行返回一个保留计数为+1的非自动释放对象,这基本上将所有权授予调用方:

return [[self alloc] initWithFile:filename];
根据,您应该通过方便的方法返回自动释放的对象,例如:

return [[[self alloc] initWithFile:filename] autorelease];

如果您有Snow Leopard和Xcode 3.2,您可能希望尝试运行静态分析器,通过按Cmd+Shift+A来查找此类错误。

羞愧地垂下头。我有一个framework.h,它导入我的所有框架头,如下所示://。。。#导入“State.h”#导入“TileMap.h”//。。。然后,我将framework.h导入到非framework文件中,在本例中是TitleState.h(它扩展了
State
)。以这种方式导入的其他类和方法都不会导致警告或语法着色异常,但您是对的。从framework.h中删除
#import“TileMap.h”
,并将其直接添加到TitleState.m中,消除了警告(语法着色问题仍然存在,但我可以接受)。我认为这回答了我的问题,但考虑了更多,为什么重命名类和方法不是问题?对于那些在2011年或以后阅读本文的人来说,这是在我们没有ARC的时候编写的。当您使用ARC时,这显然不再适用,尽管它仍然适用于手动内存管理。