Ios 无法从块将对象添加到NSMutableArray
我有一种感觉,我在这里的问题其实是阻塞,但也许它是其他的东西了。我正在尝试转发一个地址的地理编码,并将坐标放入一个数组中供以后使用 当我尝试调用我尝试添加到块中数组中的一个对象时,底部会引发异常。在块文本中打印出任何NSLog之前,也会引发异常 正确的处理方法是什么?谢谢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
- (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];
}];
}