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];
}

执行与上述相同的 NSlogcellForRowAtIndexPath会导致模拟器崩溃。

4

1 回答 1

2

这是内存管理错误。在这一行:

newfriendsArray = [friendsArray sortedArrayUsingDescriptors:sortDescriptors];

sortedArrayUsingDescriptors:如果您想使用它比当前方法更长时间,则返回一个需要保留的自动释放对象。上面的行:

newfriendsArray = [[NSArray alloc] init];

除了在代码中引入内存泄漏之外没有任何影响。您似乎还不太了解何时需要创建新对象以及其他方法何时为您执行此操作。此外,您应该真正使用属性来设置您的 ivars ( self.newFriendsArray = ...;) 以避免这些简单的内存管理错误。

于 2012-06-13T11:06:21.350 回答