2

友達、

計測器でコードを実行すると、5行でメモリリークが表示されます(次のコードから)つまり cell = [[[NSBundle mainBundle] loadNibNamed:@"ZoomCustomVideoCell" owner:self options:nil] objectAtIndex:0];

そこにメモリリークが表示される理由と、その解決策は何なのかわかりません

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

    static NSString *CellIdentifier = @"ZoomCustomVideoCell";

    ZoomCustomVideoCell *cell = (ZoomCustomVideoCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[NSBundle mainBundle] loadNibNamed:@"ZoomCustomVideoCell" owner:self options:nil] objectAtIndex:0];

        cell.m_zoomMsg = [[[ZoomMessage alloc] init] autorelease];
        [[cell m_zoomMsg] initWithJSON:[m_tmpVideoList objectAtIndex: indexPath.row]];
        [[cell videoLabel] setText:[cell.m_zoomMsg _from]];
        [[cell m_labelLocation] setText:[NSString stringWithFormat:@"%@", cell.m_zoomMsg._location]];
        [[cell videoLabelB] setText:[cell.m_zoomMsg _uploadDesc]];
        NSLog(@"UserName: %@", [[cell videoLabel] text]);

        [cell refreshImage];

    }

    return cell;
}
4

2 に答える 2

1

このメソッドは、nibの「ファイルの所有者」としてloadNibNamed:owner:options:渡された引数を取ります。owner:これは、ペン先のコンセントが、所有者として渡すものすべてに接続されることを意味します。所有者として合格しているため、以前に割り当てられたアウトレットは、新しくロードされたペン先のselfアウトレットで上書きされます。selfアウトレット接続を確立するために、nibローダーはsetValue:forKey:提供された所有者を使用します。正しいメモリ管理を備えたプロパティとしてアウトレットを設定している場合は、リークは発生しないはずです。インスタンス変数としてアウトレットしかない場合(不明ですが、私は推測しています)、オブジェクトは設定されたときに自動的に保持されます。

ここには2つの解決策があります。

  1. アウトレットに適切なメモリ管理を提供します。たとえば、まだプロパティになっていない場合はプロパティに変換し、正しいメモリ管理属性を持っていることを確認します。

  2. メソッドに別の所有者を提供しloadNibNamed:owner:options:ます。1つはまだアウトレットが確立されておらず、もう1つはアウトレットを適切に処理することがわかっています。

于 2013-01-31T09:46:45.020 に答える
0

この行により、メモリリークが発生します。

cell = [[[NSBundle mainBundle] loadNibNamed:@"ZoomCustomVideoCell" owner:self options:nil] objectAtIndex:0];

次のように変更します。

cell = [[[[NSBundle mainBundle] loadNibNamed:@"ZoomCustomVideoCell" owner:self options:nil] objectAtIndex:0] autorelease];
于 2012-10-25T08:14:53.173 に答える