0

メモリの割り当て解除と解放されたオブジェクトへのメッセージ送信という、単純でありながら厄介な問題に直面しています。

Web ページから RSS フィードを取得しようとしています。アプレットを 2 段階で開発しました。ステージ 1 では、まだ iphone 開発に慣れていないので、Web ページから 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];
}

ポスト クラッシュはいくつかの NSMutableString と UIImage であり、それらはすべて独自の init で割り当ておよび初期化され、独自の dealloc メソッドで割り当て解除されます。スクロールせずにセルをタップしようとすると問題が発生しますが、それは明日の問題です。

4

3 に答える 3

1
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;
}
于 2011-02-15T01:40:05.317 に答える
1

解決しました!単純な初期化問題

前 :

    -(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

于 2011-02-15T12:30:10.883 に答える
0

ほとんどの場合、データソースが時期尚早に自動リリースされることに問題があります。オブジェクトを保持するか、オブジェクトとメソッド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;

お役に立てば幸いです。Rog

于 2011-02-15T01:52:18.040 に答える