Вчера я задал вопрос об управлении памятью и Singletons ( Правильное управление хранилищем данных Singleton в IOS с веб-службой ).Последние 36 часов я ломал голову, пытаясь отследить проблему, и после тщательного тестирования с помощью NSLog и т. Д. Я могу только заключить, что объекты, размещенные в блоках, не выпускаются автоматически.Я использовал блоки как способ обработки асинхронных ответов веб-сервиса.Я также отправляю блок из контроллера представления, который должен сделать запрос веб-службы, чтобы он мог выполнять любые действия, основанные на ответе веб-службы.В надежде, что исчерпывающий обзор моего кода поможет найти решение, я помещаю весь код, который вызывает проблему, здесь:
Первый шаг - сделать запрос от моего корневого контроллера представления.Когда он загружается, я запрашиваю у всех пользователей «Hollers» термин, который я использую внутри для обозначения событий.Когда загружается контроллер корневого представления, я вызываю метод, который содержит следующий код:
HollerWebService *api = [[HollerWebService alloc]init];
//NSLog(@"About to get the hollers for userId: %@", [[[CurrentSession defaultStore]currentUser]userId]);
[api getLatestHollers:[[[CurrentSession defaultStore]currentUser]userId] completionBlock:^(BOOL succeeded) {
//If the user has 0 hollers, display one of the illustrations
[self.tableView reloadData];
[self stopLoading];
if( !succeeded ){
UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Could not connect to Holler" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[av show];
[av release];
}
else
{
for( Holler *hN in [[HollerStore defaultStore] allHollers] )
{
//Retain count of all the hollers is
NSLog(@"Retain count of the holler is %i", [hN retainCount]);
}
}
}];
[api release];
Как вы можете видеть, у меня есть закомментированная область, в которой выводится счетчик сохранения для NSLog, который был частью моей отладки.процесс.На данный момент, это говорит мне, что счетчик хранения каждого объекта равен 2, что означает, что оригинальный Holler, сгенерированный в следующем наборе кода, еще не был автоматически выпущен.Следующий набор кода находится в моем реальном веб-сервисе.Я включил комментарии вокруг ключевой части этого метода, что привело к увеличению количества сохранений:
- (void)getLatestHollers: (NSString *)userId completionBlock:(void (^)(BOOL succeeded))handler
{
[self getRequest:[[NSString alloc]initWithFormat:@"hollers/feed?user_id=%@",userId] completionBlock:^(NSData *receivedData, NSURLResponse *receivedResponse, NSError *error) {
if( error == nil )
{
SBJsonParser *json = [SBJsonParser new];
NSArray *response = [json objectWithData:receivedData];
[json release];
//NSLog(@"Got the latest Hollers. %@", response);
HollerStore *hStore = [HollerStore defaultStore];
for( NSDictionary *holler in response )
{
//At this point Holler *h is being sent an autoreleased holler
//from the parseHoller: method. At this point it's retain count is 1
Holler *h = [self parseHoller:holler];
[hStore addHoller:h];
//Now that I've added it to my singleton the retain count is 2, although I'm
//assuming the autorelease pool will eventually come through and reduce this
//to 1 but it never happens
}
handler(YES);
}
else
{
NSLog(@"The API failed :(, %@", [error localizedDescription]);
//Let the requestor know that this request failed
handler(NO);
}
}];
}
В этот момент счет сохранения остается на уровне 2, а не 1, поэтому, когда я иду, чтобы удалить объект измой синглтон, это приводит к утечке памяти.Единственное, что я могу сделать вывод, это то, что у меня возникают какие-то проблемы с памятью, связанные с блоками.Если бы кто-нибудь мог дать какое-то понимание, это было бы очень ценно !!!