Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 无法从块将对象添加到NSMutableArray_Ios_Objective C_Objective C Blocks_Nsexception - Fatal编程技术网

Ios 无法从块将对象添加到NSMutableArray

Ios 无法从块将对象添加到NSMutableArray,ios,objective-c,objective-c-blocks,nsexception,Ios,Objective C,Objective C Blocks,Nsexception,我有一种感觉,我在这里的问题其实是阻塞,但也许它是其他的东西了。我正在尝试转发一个地址的地理编码,并将坐标放入一个数组中供以后使用 当我尝试调用我尝试添加到块中数组中的一个对象时,底部会引发异常。在块文本中打印出任何NSLog之前,也会引发异常 正确的处理方法是什么?谢谢 - (NSMutableArray *)convertAddressToGeocode:(NSString *)addressString { //return array with lat/lng __bl

我有一种感觉,我在这里的问题其实是阻塞,但也许它是其他的东西了。我正在尝试转发一个地址的地理编码,并将坐标放入一个数组中供以后使用

当我尝试调用我尝试添加到块中数组中的一个对象时,底部会引发异常。在块文本中打印出任何NSLog之前,也会引发异常

正确的处理方法是什么?谢谢

 - (NSMutableArray *)convertAddressToGeocode:(NSString *)addressString
{
    //return array with lat/lng
    __block NSMutableArray *coordinates = [[NSMutableArray alloc] initWithCapacity:0];
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];

    [geocoder geocodeAddressString:addressString
             completionHandler:^ (NSArray* placemarks, NSError* error) {
                 for (CLPlacemark* aPlacemark in placemarks)
                 {
                     // Process the placemark.
                     if (error){
                         NSLog(@"Geocode failed with error: %@", error);
                         [self displayError:error];
                         return;
                     }
                     else {

                         NSArray const *keys = @[@"coordinate.latitude",
                                                 @"coordinate.longitude",
                                                 @"altitude",
                                                 @"horizontalAccuracy",
                                                 @"verticalAccuracy",
                                                 @"course",
                                                 @"speed",
                                                 @"timestamp"];

                         NSString *keylat = keys[0];
                         NSString *keylng = keys[1];

                         if (aPlacemark.location == nil)
                         {
                             NSLog(@"location is nil.");

                         }
                         else if ([keylat isEqualToString:@"coordinate.latitude"] && [keylng isEqualToString:@"coordinate.longitude"])
                         {
                             NSString *lat = @"";
                             NSString *lng = @"";
                             lat = [self displayStringForDouble: [aPlacemark.location coordinate].latitude];
                             lng = [self displayStringForDouble: [aPlacemark.location coordinate].longitude];

                             NSLog(@"This never gets executed"): //THIS NEVER GETS EXECUTED
                             [coordinates addObject:[NSString stringWithFormat:@"%@",lat]];
                             [coordinates addObject:[NSString stringWithFormat:@"%@",lng]];
                         }}}}];
NSLog(@"Array: %@", coordinates[0]);  //EXCEPTION RAISED HERE, Nothing ever gets added
return coordinates;
}
下面是应该插入此方法的代码,但我不会从convertAddresstoGeocode中获取坐标以传递给ConvertCoordinateStoreModel:

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    NSString *addressToSearch = self.addressSearchField.text;
    NSMutableArray *coordinateArray = [self convertAddressToGeocode:addressToSearch];
    NSMutableArray *repModelArray = [self convertCoordinatesToRepModel:coordinateArray];
...
}
问题就在这里;只需将上述代码替换为:

NSMutableArray *coordinates = [[NSMutableArray alloc] init];

如果
geocodeAddressString
是异步操作,则之后将执行块

NSLog(@"Array: %@", coordinates[0]);
另外,在方法调用结束后(当事件已经处理时),坐标数组将被删除 已释放(这是因为_块修改器-块不使用_块修改器保留对象),并且在块中尝试使用解除分配的
坐标
数组

再一次:

您的块将在
NSLog(@“Array:%@”,坐标[0])之后调用

f.e.:

  • 删除
    NSLog(@“数组:%@”,坐标[0])-此时数组为空是正常的
  • 将您的
    坐标
    数组存储在某些
    @属性
    中,您可以在块中使用后释放它
  • 更新:

    在.h文件中

    typedef void (^ConverteArrayCallback)(NSArray *coordinates); 
    
    @intrerface

    - (void)convertAddressToGeocode:(NSString *)addressString callback:(ConverteArrayCallback) callback;
    
    在.m文件中

    - (void)convertAddressToGeocode:(NSString *)addressString callback:(ConverteArrayCallback) callback { 
        NSMutableArray *coordinates = [[NSMutableArray alloc] initWithCapacity:0];
        CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    
        [geocoder geocodeAddressString:addressString
                 completionHandler:^ (NSArray* placemarks, NSError* error) {
                     for (CLPlacemark* aPlacemark in placemarks)
                     {
                         // Process the placemark.
                         if (error){
                             NSLog(@"Geocode failed with error: %@", error);
                             [self displayError:error];
                             return;
                         }
                         else {
    
                             NSArray const *keys = @[@"coordinate.latitude",
                                                     @"coordinate.longitude",
                                                     @"altitude",
                                                     @"horizontalAccuracy",
                                                     @"verticalAccuracy",
                                                     @"course",
                                                     @"speed",
                                                     @"timestamp"];
    
                             NSString *keylat = keys[0];
                             NSString *keylng = keys[1];
    
                             if (aPlacemark.location == nil)
                             {
                                 NSLog(@"location is nil.");
    
                             }
                             else if ([keylat isEqualToString:@"coordinate.latitude"] && [keylng isEqualToString:@"coordinate.longitude"])
                             {
                                 NSString *lat = @"";
                                 NSString *lng = @"";
                                 lat = [self displayStringForDouble: [aPlacemark.location coordinate].latitude];
                                 lng = [self displayStringForDouble: [aPlacemark.location coordinate].longitude];
    
                                     NSLog(@"This never gets executed"): //THIS NEVER GETS EXECUTED
                                     [coordinates addObject:[NSString stringWithFormat:@"%@",lat]];
                                     [coordinates addObject:[NSString s
    
    tringWithFormat:@"%@",lng]];
                                     }}}
    
                               if (callback != NULL) {
                                     callback(coordinates);
                               }
    
          }];
    }
    
    那应该行得通

    - (BOOL)textFieldShouldReturn:(UITextField *)textField
    {
        NSString *addressToSearch = self.addressSearchField.text;
        [self convertAddressToGeocode:addressToSearch callback:^(NSArray *coordinates)
          {  
           self.textView.text = [coordinates objectAtIndex:0];
          }];
    }
    

    在每个“if”下设置一些断点,看看[initWithCapacity:0]sheepyJust更好的做法是
    coordinates=[NSMutableArray]但这不是问题的原因。@puneetkhamath你错了,这只是为了优化,来自苹果文档:可变阵列根据需要扩展;numItems只是建立对象的初始容量。检查“placemarks”数组计数。为什么,容量有什么问题?这只是为了优化,我错了吗;numItems只是建立对象的初始容量。为了更新@property坐标,我是否应该将此方法转换为(void)而不是NSMutable数组方法?@user2033783是的,如果需要在填充数组后获取回调,则应将其转换为void,您可以将带有所需参数的块作为methodf.e的参数传递。typedef void(^converterrayCallback)(NSArray*坐标);-(NSMutableArray*)convertAddressToGeocode:(NSString*)addressString回调:(ConvertArrayCallback)回调{…}@user2033783请检查更新的解决方案,我现在无法访问XCode:)
    
    - (BOOL)textFieldShouldReturn:(UITextField *)textField
    {
        NSString *addressToSearch = self.addressSearchField.text;
        [self convertAddressToGeocode:addressToSearch callback:^(NSArray *coordinates)
          {  
           self.textView.text = [coordinates objectAtIndex:0];
          }];
    }