прокрутка таблицы вызывает сбой - PullRequest
0 голосов
/ 15 февраля 2011

Я сталкиваюсь с простой, но раздражающей проблемой освобождения памяти и отправки сообщений освобожденному объекту.

Я пытаюсь получить RSS-канал с веб-страницы. Я разработал апплет в 2 этапа, на первом этапе, так как я еще не знаком с разработкой для iphone, я попытался получить текстовую часть RSS-канала с веб-страницы с успехом и без проблем. На этапе 2 я попытался получить ссылки на изображения и представить их как на каждом UITableViewCell, так и в подробном представлении впоследствии.

У меня есть класс, который загружает rss и отвечает за синтаксический анализ и возврат изменяемого массива, который я возвращаю через [array copy]. все работает хорошо, хотя для загрузки требуется некоторое время. Когда я запускаю приложение и пытаюсь прокрутить табличное представление, я получаю сбой и сообщение NSZombie:

objc [37372]: FREED (id): сохранение сообщения отправлено освобожденному объекту = 0x3930cd0

и это происходит также, когда я пытаюсь загрузить detailViewController без прокрутки, я публикую часть tableViewController, чтобы увидеть, что не так.

- (void)viewDidLoad {
    [super viewDidLoad];
    post = [[Posts alloc]init];
    //self.tableView.rowHeight = 160.0;
    self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
    self.navigationController.navigationBar.tintColor = [UIColor purpleColor];
    NSLog(@"parser is about to init");
    parser = [[XmlParser alloc] init];
    array = [parser initWithURL:@"http://backend.deviantart.com/rss.xml?q=boost%3Apopular+meta%3Aall+max_age%3A8h&type=deviation&offset=0"];
    //array = [parser initWithURL:@"http://www.enet.gr/rss?i=news.el.categories&c=politikh"];
    NSLog(@"posts has %d items",[array count]);
    [parser release];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView  dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
        post = [array objectAtIndex:indexPath.row];
        // Set up the cell...
        [cell.textLabel text:[post itemTitle]];
        [cell.detailTextLabel setText:[post itemBody]];
        [cell.imageView setImage:[self.post itemthumbnail]];

    }
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // Navigation logic may go here. Create and push another view controller.
     FirstDetailedViewController *anotherViewController = [[[FirstDetailedViewController alloc] initWithNibName:@"FirstDetailedViewController" bundle:nil]autorelease];
    NSLog(@"posts count : %d", [array count]);
    post = [array objectAtIndex:indexPath.row];
    anotherViewController.currpost = [post retain];
    [self.navigationController pushViewController:anotherViewController animated:YES];
}

Post clash - это некоторые NSMutableStrings и UIImages, все они размещаются и инициализируются в своем собственном init и освобождаются в своем собственном методе dealloc. У меня также возникают проблемы, когда я пытаюсь нажать на ячейку без прокрутки, но это проблема завтра.

Ответы [ 3 ]

1 голос
/ 15 февраля 2011

Решено! простая задача инициализации

Предыдущая:

    -(id)init
{   
    [super init];
    channelTitle = [[NSMutableString alloc]init];
    channelLink = [[NSMutableString alloc]init];
    channelDescription = [[NSMutableString alloc]init];
    channelPubDate = [[NSMutableString alloc]init];
    itemTitle = [[NSMutableString alloc]init];
    itemBody =  [[NSMutableString alloc]init];
    itemPubDate = [[NSMutableString alloc]init];
    itemLink = [[NSMutableString alloc]init];
    itemthumbnail = [[UIImage alloc]init];
    itemthumbnailLink = [[NSString alloc]init];
    itemImage = [[UIImage alloc]init];
    itemImageLink = [[NSString alloc]init];
    return self;
}

Сейчас:

-(id)init
{   
    if (self==[super init]){
    channelTitle = [[NSMutableString alloc]init];
    channelLink = [[NSMutableString alloc]init];
    channelDescription = [[NSMutableString alloc]init];
    channelPubDate = [[NSMutableString alloc]init];
    itemTitle = [[NSMutableString alloc]init];
    itemBody =  [[NSMutableString alloc]init];
    itemPubDate = [[NSMutableString alloc]init];
    itemLink = [[NSMutableString alloc]init];
    itemthumbnail = [[UIImage alloc]init];
    itemthumbnailLink = [[NSString alloc]init];
    itemImage = [[UIImage alloc]init];
    itemImageLink = [[NSString alloc]init];
    }
    return self;
}

фактическое изображение никогда не выделялось! теперь есть! : D

1 голос
/ 15 февраля 2011
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
    post = [array objectAtIndex:indexPath.row];
    // Set up the cell...
    [cell.textLabel text:[post itemTitle]];
    [cell.detailTextLabel setText:[post itemBody]];
    [cell.imageView setImage:[self.post itemthumbnail]];

}
return cell;}

Вы не хотите настраивать каждую ячейку для отображения в этом месте в коде.Ваш код должен выглядеть примерно так:

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
    }
    post = [array objectAtIndex:indexPath.row];
    // Set up the cell...
    [cell.textLabel text:[post itemTitle]];
    [cell.detailTextLabel setText:[post itemBody]];
    [cell.imageView setImage:[self.post itemthumbnail]];

   return cell;
}
0 голосов
/ 15 февраля 2011

Скорее всего, проблема с преждевременным автоматическим выпуском вашего источника данных.Попробуйте сохранить объект array или объявите для него (оставьте) свойство и в своем методе viewDidLoad:

NSArray *tmpArray = [parser initWithURL:@"http://backend.deviantart.com/rss.xml?q=boost%3Apopular+meta%3Aall+max_age%3A8h&type=deviation&offset=0"];
self.array = tmpArray;

Надеюсь, что поможет.Рог

...