Я начал заниматься рамкой ObjectiveFlickr с целью создания относительно простого приложения для iPhone, показывающего геотегическое содержимое Flickr в текущем регионе MKMapView. Я столкнулся с проблемой, связанной с резьбой before, и теперь у меня такое чувство, что я получаю что-то принципиально неправильное в своей архитектуре. В основном то, что у меня есть:Правильное место для вещей в Objective-C
- MainViewController, что создает и обрабатывает объект MKMapView и кнопка
- Нажатие кнопки вызывает метод, который вызывает Flickr API для геотегами фотографий в пределах текущей карты степени.
- Метод обратного вызова для этого вызова API выполняет итерации через результаты и помещает их в объект NSMutableArray объектов FlickrImage. FlickrImage - это простой класс данных, содержащий местоположение изображения flickr как CLLocation, 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 asunchronously и должен сохранять координату, возвращенную в соответствующей переменной-члене.
Я уверен, что это не происходит, потому что я получаю
malloc: *** error for object 0x451bc04: incorrect checksum for freed object - object was probably modified after being freed.
посыпают вокруг моей отладочный вывод, и почти всегда EXC_BAD_ACCESS
но не всегда в той же точке.
Я явно делаю что-то принципиально неправильное здесь, но что?
У вас есть идеи, что такое объект 0x452bc04? Если вы регистрируете адреса своих объектов, особенно объекты FlickrImage, вы можете посмотреть адрес отладчика и увидеть, по крайней мере, какой класс не прошел. – TechZen
Вы должны вставить код последних двух шагов (создание, сохранение и изменение FlickrImages). –
@ kai1968 - добавил фрагменты кода – mvexel