声明和合成NSArray适用于所有方法,但只有一种

时间:2012-06-13 10:40:18

标签: iphone objective-c nsarray

我有一个已经排序的NSMutableDictionaries数组。

此数组已声明并合成,因此可在代码中的任何位置访问。但是,它不是。

当我尝试在cellForRowAtIndexPath中读取它时,我得到0x5852400似乎没有使用po命令指向调试器中的有效对象,并且在使用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];
}

执行与cellForRowAtIndexPath中相同的NSlog将导致模拟器崩溃。

1 个答案:

答案 0 :(得分:2)

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

newfriendsArray = [friendsArray sortedArrayUsingDescriptors:sortDescriptors];

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

newfriendsArray = [[NSArray alloc] init];
除了在代码中引入内存泄漏之外,

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