33

我的问题的一个简单示例:

“在 BlahDataController.h 中”

@interface BlahDataController : NSObject
-(NSString *)aMethod:(NSString *)theString;
@end

“在 BlahDataController.m 中”

#import "BlahDataController.h"
@implementation BlahDataController

-(NSString *)aMethod:(NSString *)theString
{
    return @"Something";
}

@end

“在 BobViewController.h 中”

@interface BobViewController : NSObject
-(void)aMethodOfSomeSort;
@end

“在 BobViewController.m 中”

#import "BobViewController.h"
#import "BlahDataController.h"

@implementation BobViewController

-(void)aMethodOfSomeSort
{
    BlahDataController *blahDataController = [[BlahDataController alloc] init];
    NSLog(@"%@",[blahDataController aMethod:@"Variable"]);
}

@end

在行上“NSLog(@"%@",[blahDataController aMethod:@"Variable"]);" 我收到错误消息:“'BlahDataController' 没有可见的@interface 声明选择器'aMethod:'”

有谁知道为什么会发生这个错误?

-=-=-=-=-=-=-=-=-=-=-

问题是,在我的实际程序中,我有相同的实现,并且它适用于以这种方式创建的数百种方法。但是,每隔一段时间,我就会在新创建的方法上收到此错误。我没有做任何不同的事情。它只是不会承认它是新创造的存在。

-=-=-=-=-=-=-=-=-=-=-

这就是我目前正在解决的问题,虽然我不知道为什么编译器接受这种方式,但不是其他方式:

修改 BobViewController.m:

#import "BobViewController.h"
#import "BlahDataController.h"
#import "AnotherDataController.h"

@implementation BobViewController

-(void)aMethodOfSomeSort
{
    BlahDataController *blahDataController = [[BlahDataController alloc] init];
    AnotherDataController *anotherDataController = [[AnotherDataController alloc] init];
    [anotherDataController fixedMethod:blahDataController theString:@"Variable"];
}

@end

“在 AnotherDataController.h 中”

@interface AnotherDataController : NSObject
-(void)fixedMethod:(BlahDataController *)blahDataController theString:(NSString *)theString;
@end

“在另一个数据控制器.m 中”

#import "AnotherDataController.h"
#import "BlahDataController.h"
@implementation AnotherDataController

-(void)fixedMethod:(BlahDataController *)blahDataController theString:(NSString *)theString
{
    NSLog(@"%@",[blahDataController aMethod:theString]);
}
@end

而且......它工作得很好......所以我想xcode只是无法识别一个类中的方法,并且在另一个类中正常工作......伙计,我不知道为什么会发生这个错误...... .

-=-=-

次要更新:
做整个“xcode dance”并没有解决问题
1)清理构建
2)删除派生数据
3)完全关闭 XCode 并重新打开

4

5 回答 5

58

tl;dr - 项目中某处存在重复文件!去追捕它并无情地摧毁它!

好的,对于所有将来遇到此问题的人;这就是问题所在。

几个月前我制作了 BlahDataController。大约一周前,我重组了项目的文件夹并将 BlahDataController 从名为“Blah”的文件夹移至另一个名为“Data”的文件夹。

当我在“Data”文件夹中更改 BlahDataController 的代码时,我的一个类可以看到更改后的代码,但是,另一个类不能。

最终的问题是,当我移动 BlahDataController 时,它实际上创建了它的副本。所以我在“Data”文件夹中有一个 BlahDataController,在“Blah”文件夹中有一个较旧的 BlahDataController。即使旧的 BlahDataController 不再附加到项目管理器中的项目(xcode 的左侧),物理文件仍然存在于文件夹中的事实导致了这个问题。

删除 BlahDataController 的重复旧副本后,问题已解决。

于 2012-05-24T19:45:00.263 回答
4

如果有人偶然发现类似的问题,在我的例子中,我使用“查找和替换”功能(忽略大小写)进行了一些重构,我得到了这样的结果:

SomeClass* SomeClass = [[SomeClass alloc] init];
[SomeClass instanceMethod];

它说:“'SomeClass'没有可见的@interface声明方法'alloc'。所以在我的情况下,问题是我将实例变量重命名为大写。解决方案是:

SomeClass* someClass = [[SomeClass alloc] init];
[someClass instanceMethod];

PS:如果可能,我建议使用 Xcode 中的“重构”功能而不是“查找和替换”。

于 2014-07-02T13:47:10.720 回答
3

注意:不是这个确切问题的答案,但我在这里寻找相同的编译器错误。

确保您知道您是在调用实例方法还是静态方法:

@interface 某类

+(void) SomeMethod;

对比

-(void) SomeMethod;

这些是不同的。

[SomeClass SomeMethod];

对比

[[[SomeClass alloc] init] SomeMethod];
于 2016-05-10T13:43:07.880 回答
2

另请注意,如果

"Other Linker Flags"

值设置为

-ObjC

根据某些框架的要求,例如 RestKit(RestKits github 页面上的问题:https ://github.com/RestKit/RestKit/issues/1153 )

于 2013-01-14T12:49:16.393 回答
1

是的,我遇到了同样的问题。虽然当我更改为免费目标时,我在我的付费目标中完美地工作了这个,但我得到了这个错误。

'GameOverScene' 没有可见的@interface 声明选择器mesageToDisplayOnLabel:

  • 为了解决这个问题,我的方法调用的拼写与我调用的方法不同。

    -(void)messageToDisplayOnLabel //我在我的方法调用中缺少“消息”中的 s Doh!
    {
    //方法代码
    }

  • 检查您正在调用的方法的拼写可能会有所帮助。

于 2014-11-16T00:07:35.800 回答