【问题标题】:'TileMap' may not respond to '+mapNamed:''TileMap' 可能不会响应 '+mapNamed:'
【发布时间】:2009-12-08 17:30:48
【问题描述】:

这是一个奇怪的问题。我有一个名为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 mapNamed:@"map.plist"]; 的调用时,Xcode 会发出警告:

'TileMap' 可能不会响应'+mapNamed:'

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

我是否与一些未记录的框架类或方法发生冲突?在文档中查找不会显示任何内容。 Find in Project 只显示调用、接口定义和实现。我很难过(不是说它需要很多)。有没有办法在不改变我现有的命名约定的情况下解决这个问题?

【问题讨论】:

    标签: objective-c iphone xcode


    【解决方案1】:

    #import TileMap.h 标头了吗?您是否保存了 TileMap.h 标头?

    【讨论】:

    • 羞愧地垂头丧气。 我有一个framework.h,它像这样导入我所有的框架头文件: // ... #import "State.h" #import " TileMap.h" // ... 然后我将 framework.h 导入非框架文件,在本例中为 TitleState.h(扩展 State)。以这种方式导入的其他类和方法都不会导致警告或语法着色异常,但您是对的。从 framework.h 中删除 #import "TileMap.h" 并将其直接添加到 TitleState.m 消除了警告(语法着色问题仍然存在,但我可以忍受)。
    • 我以为这回答了我的问题,但又想了想,为什么我重命名类和方法没有问题?
    【解决方案2】:

    结果我的项目目录中包含两个 TileMap.h 和 TileMap.m 文件——在 Finder 中可见,但在 Xcode 中不可见。一、完整的接口和实现,在我的项目根目录下。另一个只是我的框架子目录中的一个裸 NSObject 子类。不知道那是怎么发生的。删除后者解决了问题。感谢同一个 Dave 的帮助。

    【讨论】:

      【解决方案3】:

      肖恩,

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

      return [[self alloc] initWithFile:filename];
      

      根据Memory Management Programming Guide for Cocoa,您应该从便利方法返回自动释放的对象,例如:

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

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

      【讨论】:

      • 对于那些在 2011 年或以后阅读本文的人,这是在我们没有 ARC 时编写的。当您使用 ARC 时,这显然不再适用,尽管它仍然适用于手动内存管理。
      猜你喜欢
      • 2014-09-02
      • 2012-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-02
      • 2011-05-24
      • 2017-01-31
      相关资源
      最近更新 更多