我在名为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')
我该如何解决这个问题?
答案 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更加严格。