1

私は何時間もモニターに頭をぶつけました (そして同様の投稿を読みました)。私はまだ困惑しています。

テーブル ビューにデータを表示する *.h ファイルで配列を宣言します。

@interface TeamsTableViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource> 
{
    NSMutableArray *teamsArray;
}

配列を割り当てて-viewDidLoad、dealloc で解放します。

-(void)viewDidLoad 
{
    [super viewDidLoad];

    // Inititalize the mutablearray that will store the xml for the table.
    teamsArray = [[NSMutableArray alloc] init];
}

-(void)dealloc 
{
    [teamsArray release];

    [super dealloc];
}

毎回-viewWillAppear、loadData を呼び出してデータをリロードします (データが変更される可能性があるため)。この投稿のために (そしてリークを見つけようとして)、データをハードコーディングしました。コメントは、報告されたリークの場所を示しています。(テーブル ビューを再表示すると、リークが発生します。)

-(void)loadData
{
    // Empty any objects that are already in the array.
    [teamsArray removeAllObjects];

    // Fill a dictionary (normally looping through a file, but hardcoded for leak hunting).
    NSMutableDictionary *oneTeamDictionary = [NSMutableDictionary dictionary];

    [oneTeamDictionary setObject:@"100"         forKey:@"basenumber"];
    [oneTeamDictionary setObject:@"Team Name"   forKey:@"teamname"];
    [oneTeamDictionary setObject:@"XYZ"         forKey:@"teamabbr"];
    [oneTeamDictionary setObject:@"USA"         forKey:@"countryabbr"];
    [oneTeamDictionary setObject:@"Joe"         forKey:@"manager"];

    // Add this team to the array used to display table data.
    [teamsArray addObject:[oneTeamDictionary copy]];  // Leaks Malloc 32 bytes and _NSCFDictionary 48 bytes here.

    // Reload the table view with new data.
    [self.tableView reloadData];
}

[teamsArray release]私の初心者の状態では、辞書オブジェクトが解放されると思います。また、「alloc] init]」を使用してディクショナリを作成し、teamsArray を解放して再割り当てしようとしました (を呼び出すのではなくremoveAllObjects)。

4

2 に答える 2

2

問題はコピー機能です。ドキュメントからのメモ:

特別な考慮事項

(ガベージコレクションではなく)マネージメモリを使用している場合、このメソッドは新しいオブジェクトを返す前に保持します。ただし、メソッドの呼び出し元は、返されたオブジェクトを解放する責任があります。

なぜあなたはただ電話しないのですか:

[teamsArray addObject:oneTeamDictionary];
于 2010-10-14T22:41:41.593 に答える
0

はいヨナ、あなたは正しいです。そのオブジェクトのコピーを作成している場合は、オブジェクトを再度解放する必要があります。保持、割り当て、可変コピー、コピーなどで...私たちはオブジェクトを負っています。だから私たちはそれらを解放しなければなりません。

于 2011-02-10T10:50:29.883 に答える