gpt4 book ai didi

objective-c - 在 Objective-C 中做事的正确位置

转载 作者:行者123 更新时间:2023-12-04 03:08:46 25 4
gpt4 key购买 nike

我开始尝试使用 ObjectiveFlickr 框架,目标是创建一个相对简单的 iPhone map 应用程序,以显示当前 MKMapView 区域内带地理标记的 flickr 内容。我遇到了与线程相关的问题 before现在我觉得我的架构出现了根本性的错误。基本上我所拥有的是:

  1. 一个 MainViewController,创建并处理 MKMapView 对象和一个按钮
  2. 点击按钮调用调用 Flickr API 的方法对于带有地理标记的照片当前 map 范围。
  3. 回调此 API 调用的方法迭代通过结果并将它们放入FlickrImage 对象的 NSMutableArray。 FlickrImage 是一个简单的数据类,它包含作为 CLLocation 的 flickr 图像位置、指向缩略图的 NSURL 和标题 NSString。

步骤 2 的代码片段:

-(void)actionSearchForTripodPhotos {
if(currentBoundingBox == nil) {
// TODO add a messagebox saying we're waiting for location info - or just lock the app until we're sure.
return;
}
NSString *dateTakenMinimumUNIXTimeStampString = [NSString stringWithFormat:@"%f",[[NSDate dateWithTimeIntervalSinceNow:-100000] timeIntervalSince1970]];
OFFlickrAPIRequest *flickrAPIRequest = [[OFFlickrAPIRequest alloc] initWithAPIContext:[CloudMadeMap101AppDelegate sharedDelegate].flickrAPIContext];
[flickrAPIRequest setDelegate:self];
NSString *flickrAPIMethodToCall = @"flickr.photos.search";
NSString *bboxString = [NSString stringWithFormat:@"%f,%f,%f,%f",currentBoundingBox.bottomLeftLat ,currentBoundingBox.bottomLeftLon ,currentBoundingBox.topRightLat ,currentBoundingBox.topRightLon];
NSLog(@"bounding box to be sent to flickr: %@",bboxString);
NSDictionary *requestArguments = [[NSDictionary alloc] initWithObjectsAndKeys:FLICKR_API_KEY,@"api_key",[NSString stringWithFormat:@"%f",currentLocation.coordinate.latitude],@"lat",[NSString stringWithFormat:@"%f",currentLocation.coordinate.longitude],@"lon",dateTakenMinimumUNIXTimeStampString,@"min_upload_date",nil];
[flickrAPIRequest callAPIMethodWithGET:flickrAPIMethodToCall arguments:requestArguments];
}

第 3 步的代码片段:

- (void)flickrAPIRequest:(OFFlickrAPIRequest *)inRequest didCompleteWithResponse:(NSDictionary *)inResponseDictionary {
NSDictionary *photosDictionary = [inResponseDictionary valueForKeyPath:@"photos.photo"];
NSDictionary *photoDictionary;
FlickrImage *flickrImage;
for (photoDictionary in photosDictionary) {
NSLog(@"photodictionary is %@",[photoDictionary description]);
flickrImage = [[FlickrImage alloc] init];
flickrImage.thumbnailURL = [[appDelegate sharedDelegate].flickrAPIContext photoSourceURLFromDictionary:photoDictionary size:OFFlickrThumbnailSize];
flickrImage.hasLocation = TRUE; // TODO this is actually to be determined...
flickrImage.ID = [NSString stringWithFormat:@"%@",[photoDictionary valueForKeyPath:@"id"]];
flickrImage.owner = [photoDictionary valueForKeyPath:@"owner"];
flickrImage.title = [photoDictionary valueForKeyPath:@"title"];
[flickrImages addObject:flickrImage];
[photoDictionary release];
}
}

一切顺利。恼人的是,API 不会为每张照片返回地理位置,因此这需要另一个 API 调用。我以为我可以在 FlickrImage 类中执行此操作,但这里变得很丑陋:

  • MainViewController 每次迭代都会创建一个 FlickrImage 实例,并将其存储在 NSMutableArray 中。
  • FlickrImage 实例异步调用地理定位 Flickr API,并应将返回的坐标存储在适当的成员变量中。

我很确定这不会发生,因为我得到了

malloc: *** error for object 0x451bc04: incorrect checksum for freed object - object was probably modified after being freed.

散布在我的调试输出周围,几乎总是 EXC_BAD_ACCESS 但并不总是在同一点。

我显然在这里做了一些根本性的错误,但是什么?

最佳答案

错误的意思和它说的完全一样:你可能修改了内存释放它之后,EXC_BAD_ACCESS 指示您正在尝试访问不存在的数组元素。在您尝试调用地理定位方法时,我会检查您的 FlickrImage 对象是否未被释放。

您的设计中没有任何明显的根本缺陷

关于objective-c - 在 Objective-C 中做事的正确位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1881719/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com