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

时间:2015-04-08 17:05:56

标签: ios objective-c afnetworking

我在名为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::'

我进入Build Settings并将其添加到Login.m:

-fno-objc-arc

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

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

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

您应该在此行中看到Xcode中的警告/错误:

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

您缺少第三个参数的名称,直接从passwordTextField.text转到:。编译器将其作为未命名参数读取并将其转换为选择器UserLogin:andPassWordExists::。请注意,它最后有两个冒号而不是一个。由于您没有声明选择器,因此会引发错误/警告。

该行应如下所示:

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

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

此外,请确保为该文件重新打开ARC,这样就不会遇到内存泄漏问题。正如您所看到的,这不是一个真正的ARC问题,因为这两个设置都会产生类似的警告/错误。 ARC拒绝编译的原因是当它遇到未声明的选择器(在这种情况下为UserLogin:andPassWordExists::)时,它不知道返回的值是否是对象,并且它无法进行内存管理决策。在ARC之前,开发人员可以查找未声明的方法,查看返回类型并应用正确的操作。 ARC更加严格。