Это мой первый пост на stackoverflow.com, поэтому, пожалуйста, будьте добры (перемотка назад);)
У меня есть приложение на основе навигации, целью которого является отображение сообщений блога (заголовка) в табличном представлении (с JSON).
Проблема, с которой я столкнулся, возникла, когда ячейка вышла из экрана, а затем вернулась обратно.
Я получал EXC_BAD_ACCESS (потому что я отправил сообщение в освобожденный экземпляр), поэтому я изо всех сил пытался понять, откуда оно пришло, и я наконец нашел решение. Но дело в том, что я не совсем понимаю, как возникает проблема. Вот почему мне нужен кто-то, чтобы просветить меня, я думаю, что это фундаментальное понимание!
Когда соединение с веб-службой JSON завершило загрузку, я анализирую код JSON, чтобы получить список сообщений в блоге (RecentPosts), затем я создаю объект BlogArticle для каждого сообщения (blogArticle), сохраняя его в MutableArray iVar (allEntries) и вставьте строку в табличное представление:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
[connection release];
NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
[responseData release];
NSError *error;
SBJsonParser *json = [[SBJsonParser new] autorelease];
NSDictionary *recentPostsData = [json objectWithString:responseString error:&error];
[responseString release];
NSArray *recentPosts = [recentPostsData objectForKey:@"posts"];
int i = 0;
for (NSDictionary *post in recentPosts) {
BlogArticle *blogArticle = [[BlogArticle alloc] initWithDictionary:post];
[allEntries insertObject:blogArticle atIndex:i];
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:i inSection:0]] withRowAnimation:UITableViewRowAnimationRight];
i++;
}
}
Вот инициализация объекта BlogArticle, которая оказалась источником проблемы:
- (id)initWithDictionary:(NSDictionary *)article
{
if (self = [super init])
{
// title = [[[article valueForKey:@"title"] gtm_stringByUnescapingFromHTML] copy];
// title = [[NSString alloc] initWithString:[[article valueForKey:@"title"] gtm_stringByUnescapingFromHTML]];
title = [[article valueForKey:@"title"] gtm_stringByUnescapingFromHTML];
}
return self;
}
Таким образом, каждый программист Objective-C, который не так болтлив, как я, может сказать, что заголовок никогда не выделяется до назначения. Если я раскомментирую одну из двух строк выше, она будет работать. Программа вылетает именно тогда, когда я пытаюсь инициализировать ячейку с этой переменной заголовка, здесь:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
NSLog(@"indexPath.row = %i", indexPath.row);
// Configure the cell.
BlogArticle *article = [allEntries objectAtIndex:indexPath.row];
cell.textLabel.text = article.title;
return cell;
}
Теперь мне нужно понять, почему он выполняет компиляцию / работу без выделения iVar и где именно это вызывает проблемы (или где именно высвобождается содержимое заголовка, вызывающее сбой программы).
Любой хороший ресурс (дружественный по отношению к новичкам) об управлении памятью в среде iOS был бы очень признателен.
Заранее спасибо:)