2012-01-12 69 views
2

这可能是一个超级简单的错误,但我的眼睛实际上是从试图追捕它出血。起初,我认为ARC可能会扮演一个角色,但现在它完全被禁用了,而且我仍然遇到了这个错误。潜在简单的目标C错误与协议

我有一个UMLLanguageProtocol协议,该协议定义了一个静态方法

+(NSArray *)methodFormatComponents; 

我试图调用一个函数内的方法,但它没有被Xcode的识别(“没有已知的类的方法选择器”)。

这里就是我想使用它的代码:

#import "UMLLanguageProtocol.h" 

@implementation UMLMethod 

@dynamic documentation; 
@dynamic name; 
@dynamic umlClass; 

+(void)validPortionOfMethod:(NSString *)method inLanguage:(Class<UMLLanguageProtocol>)language { 
    [language methodFormatComponents]; <-- Error: No known class method selector 
} 

@end 

和协议本身,在UMLLanguageProtocol.h定义

#import <Foundation/Foundation.h> 

#define VISIBILITY_SPECIFIER_COUNT 6 

@class UMLMethod; 
@class UMLAttribute; 
@class UMLParameter; 

typedef enum { 
    PUBLIC, 
    PRIVATE, 
    PROTECTED, 
    PACKAGE, 
    DERIVED, 
    STATIC 
} visibility; 

@protocol UMLLanguageProtocol 

/* 
* Language Specifiers 
*/ 
+(NSArray *)nativeDataTypes; 

// Return a 6 item array with YES if the language supports that visibility 
// specifier at the given index, and no if it doesn't. 
+(NSArray*)visibilitySpecifiersForVariables; 
+(NSArray*)visibilitySpecifiersForMethods; 

/* 
* Parsing Methods 
*/ 
// Returns a regex string that defines a validly formatted method 
+(NSString *)methodFormat; 
+(NSArray *)methodFormatComponents; 

@optional 
+(NSString*)documentationCommentFromText:(NSString*)comment; 
+(NSString*)scaffoldTextFromMethod:(UMLMethod*)method; 
+(NSString*)scaffoldTextFromParameter:(UMLParameter *)parameter; 
+(NSString*)scaffoldTextFromAttribute:(UMLAttribute*)attribute; 

+(NSArray *)additionalCommonDataTypes; 
+(NSString *)defaultRootObject; 

@end 

严重的是,我失去了头发,我写这...请帮助!


更新:其实,它似乎错误是在问题导航器中的两个部分。第一部分是“自动引用计数问题”,第二行是“没有已知类选择器的方法”。奇怪的是,这可能与ARC有什么关系?

+0

您是否检查过正在传递给'validPortionOfMethod'的语言参数并确认该类确实实现了'methodFormatComponents'类方法?另外,请尝试更改为'inLanguage :(id)language',而不是'inLanguage:(Class )language' – Jeremy 2012-01-12 00:58:12

+0

我无法重现这一点,我似乎能够做到完全正确,没有错误。编译器命令行来查看是否有任何区别? – mattjgalloway 2012-01-12 01:15:08

+0

@Jeremy如果他这样做,他也将不得不改变他如何调用methodFormatComponents方法。 FWIW,我可以将UMLLanguageProtocol.h文件添加到项目中,然后粘贴另一个类中的validPortionOfMethod方法(例如AppDelegate)并编译对我来说很好。 – UIAdam 2012-01-12 01:17:43

回答

0

没有怪异的方式>:|

我刚刚复制了该协议文件的内容,将其从我的项目中删除,重新创建它,将所有内容都粘贴回来,并且工作正常。 XCode,你会在这一天!

感谢每一位帮助过我这个疯狂追逐的人。我很抱歉,结果如此不令人满意:(

0

我认为你需要改变

[language methodFormatComponents]; 

[[language class] methodFormatComponents]; 

不过,虽然@Ben小号的观点是好的。它可能没有任何意义,所有的方法都是类级别的,应该可能更改为实例方法。

+0

但参数语言已经是类型类,不是吗? – Plastech 2012-01-12 01:10:43

+0

'[language methodFormatComponents];'是正确的,因为该方法的参数被声明为Class UIAdam 2012-01-12 01:13:46