Objective-c 没有可见的@interface 声明选择器

Objective-c No visible @interface declares the selector

我在名为 LHJSonData.h:

的文件中声明了 void 方法
-(void)UserLogin:(NSString *)user andPassWordExists:(NSString *)password;

在我的 LHJsonData.m 文件中有这一行:

@implementation LHJSonData

这给了我这个警告:

/Users/jsuske/Documents/SSiPad(Device Only)ios7/SchedulingiPadApplication/Classes/LHJSonData.m:12:17: Method definition for 'UserLogin:andPassWordExists:' not found

我在LHJsonData.m

中有这个方法
-(void)UserLogin:(NSString *)user andPassWordExists:(NSString *)password completionHandler:(void (^)(NSArray *resultsObject, NSError *error))completionHandler
{


   NSURL *url = [NSURL URLWithString:kIP];
   NSURLRequest *request = [NSURLRequest requestWithURL:url];

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]
                                         initWithRequest:request];

    [operation setCredential:[NSURLCredential credentialWithUser:[@"domain" stringByAppendingString:user]
                                                        password:password persistence:NSURLCredentialPersistenceForSession]];

    operation.responseSerializer = [AFJSONResponseSerializer serializer];

    [[NSOperationQueue mainQueue] addOperation:operation];

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

        if (completionHandler) {
            completionHandler(responseObject, nil);
        }

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

        if (completionHandler) {
            completionHandler(nil, error);
        }

    }];

    [operation start];
}

我没有收到该代码的错误或警告。

当我在另一个文件中调用这个方法时,让我们调用它 Login.m:

- (void)Login
{
    NSString *rawString = [self.idTextField text];
    NSCharacterSet *whitespace = [NSCharacterSet whitespaceAndNewlineCharacterSet];
    [self.idTextField setText:[rawString stringByTrimmingCharactersInSet:whitespace]];
    //BOOL *isAuthenticated = [userName User:self.idTextField.text andPassWordExists:self.passwordTextField.text];

    [userName UserLogin:self.idTextField.text andPassWordExists:self.passwordTextField.text:^(id responseObject, NSError *error) {
        if (responseObject) {
            [self CustomAlert:@"You have login"];
            /*[self.idTextField removeFromSuperview];
            [self.passwordTextField removeFromSuperview];
            [self.loginButton removeFromSuperview];
            self.idTextField = nil;
            self.passwordTextField = nil;
            self.loginButton = nil;
            [self CreateMenu];*/
        }else{

            [self CustomAlert:@"Sorry Login Failed, User and/or Passsword Incorrect"];
        }
    }];

我得到这个错误:

ARC Semantic Issue
LHLoginController.m:240:15: No visible @interface for 'LHJSonData' declares the selector 'UserLogin:andPassWordExists::'

我进入构建设置并将其添加到 Login.m:

-fno-objc-arc

那消除了错误,但现在我收到警告并且我的应用程序崩溃了,警告是:

Semantic Issue
LHLoginController.m:240:15: Instance method '-UserLogin:andPassWordExists::' not found (return type defaults to 'id')

我该如何解决这个问题?

像在 .m 文件中一样在 .h 文件中声明您的方法。

-(void)UserLogin:(NSString *)user andPassWordExists:(NSString *)password completionHandler:(void (^)(NSArray *resultsObject, NSError *error))completionHandler;

.m 方法和 .h 声明不匹配。

您应该在 Xcode 中看到 warning/error 这一行:

[userName UserLogin:self.idTextField.text andPassWordExists:self.passwordTextField.text:^(id responseObject, NSError *error) {

您缺少第三个参数的名称,直接从 passwordTextField.text:。编译器将其作为未命名参数读取并将其转换为选择器 UserLogin:andPassWordExists::。请注意,它末尾有两个冒号,而不是一个。由于您从未声明过选择器,因此引发了 error/warning。

该行应如下所示:

[userName UserLogin:self.idTextField.text andPassWordExists:self.passwordTextField.text completionHandler:^(id responseObject, NSError *error) {

正如其他人所提到的,您的方法签名在 header 中与您的实现不同。它们必须相同。您遇到这种情况很可能是因为您自动完成了一个没有完成处理程序的方法并试图修复它。

此外,请确保为该文件重新打开 ARC,以免 运行 发生内存泄漏。如您所见,这并不是真正的 ARC 问题,因为两种设置都产生了相似的 warning/error。 ARC 拒绝编译的原因是当它遇到未声明的选择器时(在本例中为 UserLogin:andPassWordExists::),它不知道 returned 值是否为 object它不能做出内存管理决定。在 ARC 开发人员可以查找未声明的方法之前,请查看 return 类型并应用正确的操作。 ARC 只是更严格。