1

並べ替えられたNSMutableDictionariesの配列があります。

この配列は、コード内のどこからでも到達できるように宣言および合成されています。しかし、そうではありません。

cellForRowAtIndexPathで読み取ろうとすると、poコマンドを使用して0x5852400がデバッガーで有効なオブジェクトを指しているように見えず、NSLogを使用するとEXC_BAD_ACCESSエラーが発生します。

コード:

- (void)request:(FBRequest *)request didLoad:(NSArray*)result
{
    int counter;
    friendsArray = [[NSMutableArray alloc] init];

    for (NSDictionary *d in [result objectForKey:@"data"])
    {   
        [friendsArray addObject:d];
        counter++;
    }

    NSSortDescriptor *sortDescriptor;
    sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"first_name" ascending:YES] autorelease];
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
    NSArray *sortedArray;

    newfriendsArray = [[NSArray alloc] init];

    newfriendsArray = [friendsArray sortedArrayUsingDescriptors:sortDescriptors];

    NSLog(@"The new array which works and has been sorted: %@", newfriendsArray);

    [[self tableView] reloadData];

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.

    NSLog(@"Array still working here: %@", newfriendsArray);

    return [newfriendsArray count];
}

上記と同じNSlogを実行cellForRowAtIndexPathすると、シミュレータがクラッシュします。

4

1 に答える 1

2

これはメモリ管理エラーです。この行で:

newfriendsArray = [friendsArray sortedArrayUsingDescriptors:sortDescriptors];

sortedArrayUsingDescriptors:現在のメソッドより長く使用する場合に保持する必要がある自動解放されたオブジェクトを返します。上記の行:

newfriendsArray = [[NSArray alloc] init];

コードにメモリリークを導入する以外の効果はありません。いつ新しいオブジェクトを作成する必要があるのか​​、他のメソッドがいつ作成するのか、よく理解していないようです。self.newFriendsArray = ...;さらに、これらの単純なメモリ管理エラーを回避するために、実際にプロパティを使用してivars()を設定する必要があります。

于 2012-06-13T11:06:21.350 に答える