NSInvalidArgumentException应用程序抛出异常NSInvalidArgumentException:data参数为nil

时间:2017-11-09 21:34:20

标签: ios objective-c

我收到一条错误消息“NSInvalidArgumentException 应用程序抛出异常NSInvalidArgumentException:数据参数为nil“,我真的不知道我的代码导致了这个错误。

-(void)AddressAfterDelay{
    if ([[[self withStringAddress:[self._dictSearchResults objectForKey:[NSString stringWithFormat:@"%@ Address",self._strFieldName]]] objectForKey:@"status"] isEqualToString:@"OK"]) {

    MapAddressViewController *mapAddressViewController = [[[MapAddressViewController alloc] initWithNibName:nil bundle:nil withAddress:[[[[self withStringAddress:[self._dictSearchResults objectForKey:[NSString stringWithFormat:@"%@ Address",self._strFieldName]]] objectForKey:@"results"] valueForKey:@"formatted_address"] objectAtIndex:0] withAccountInformation:self._dictAccountInformation withTitleAddress:[NSString stringWithFormat:@"%@ Address",self._strFieldName]] autorelease];
    [mapAddressViewController setDelegate:self];
    [self.navigationController pushViewController:mapAddressViewController animated:YES];

    } else {
        [self._fieldValidation alertMessage:@"Import Genius" Message:[NSString stringWithFormat:@"Location of this address cannot be determined. %@",[self._dictSearchResults objectForKey:[NSString stringWithFormat:@"%@ Address",self._strFieldName]]]];
    }
    [self stopIndicator];
}

-(NSDictionary*)withStringAddress:(NSString*)Address{
    Address = [NSString stringWithFormat:@"%@",[Address stringByReplacingOccurrencesOfString:@" " withString:@"+"]];
    Address = [NSString stringWithFormat:@"%@",[Address stringByReplacingOccurrencesOfString:@"\n" withString:@"+"]];
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/geocode/json?address=%@&sensor=false",Address]];

    NSError *error = nil;
    NSData *responseData = [NSData dataWithContentsOfURL:url];
    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];
    if(!error)
    {
        //log response
    }
    return dict;
}

2 个答案:

答案 0 :(得分:0)

这是我的情况,

解决

将-all_load添加到构建设置中的其他链接器标志。

-all_load强制链接器从它看到的每个存档中加载所有目标文件,即使是没有Objective-C代码的文件。


更多详情:

由于标准UNIX静态库的实现,链接器和Objective-C的动态性质之间存在问题,因此发生“无法识别选择器”运行时异常。 Objective-C并未为每个函数(或方法,在Objective-C中)定义链接器符号-而是仅为每个类生成链接器符号。如果使用类别扩展现有的类,则链接器不知道将核心类实现的对象代码与类别实现相关联。这样可以防止在结果应用程序中创建的对象响应类别中定义的选择器。

要解决此问题,针对静态库的目标链接必须将-ObjC选项传递给链接程序。此标志使链接器加载定义Objective-C类或类别的库中的每个对象文件。虽然此选项通常会导致更大的可执行文件(由于将附加的目标代码加载到应用程序中),但它将允许成功创建包含现有类类别的有效Objective-C静态库。请按照以下步骤将-ObjC传递给链接器:

在Xcode中,双击“项目”窗口中“目标”下的目标名称。从随后的“信息”窗口中选择“构建”窗格。向下滚动到“链接”集合下的“其他链接器标记”构建设置,并将其值设置为- ObjC。

答案 1 :(得分:0)

我看到您使用withStringAddress方法的响应数据。我认为您应该首先在另一个线程中等待来自url的响应,然后在数据响应后在主线程中调用方法导航到MapAddressViewController