从UITableView删除崩溃的应用程序

时间:2012-07-12 01:25:54

标签: objective-c ios xcode nsmutablearray nsarray

我有一个UITableView,我从表格滑动方法中实现了删除 出于某种原因,数组的分配导致应用程序崩溃 我想知道原因。

两个属性:

@property (nonatomic,retain) NSMutableArray *mruItems;
@property (nonatomic,retain) NSArray *mruSearchItems;
 . 
 .
 .
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

    if (editingStyle != UITableViewCellEditingStyleDelete)
        return;

    NSString *searchString = [self.mruSearchItems objectAtIndex:indexPath.row];
    [self.mruItems removeObject:searchString];

    [self.mruSearchItems release];

    // This line crashes:
    self.mruSearchItems = [[NSArray alloc] initWithArray:self.mruItems];

    [self.searchTableView reloadData];
   }

就好像删除了mruItems的对象之后,它无法帮助初始化mruSearchItems ......

谢谢!

编辑:

EXC_BAD_ACCESS

@synthesize mruItems,mruSearchItems;< - 调试器点在这里

3 个答案:

答案 0 :(得分:3)

双重释放导致崩溃。

[self.mruSearchItems release];

这使refcount -1

self.mruSearchItems = [[NSArray alloc] initWithArray:self.mruItems];

这使refcount -1

由于mruSearchItems在属性属性中具有“retain”,因此对它的赋值将导致另一个refcount -1。

因此,要么在释放之后移除释放线或将其设置为nil,然后再分配给它。


编辑: 这一行

self.mruSearchItems = [[NSArray alloc] initWithArray:self.mruItems];

导致内存泄漏,修复如下:

self.mruSearchItems = [[[NSArray alloc] initWithArray:self.mruItems] autorelease];

或:

NSArray *tmpArray = [[NSArray alloc] initWithArray:self.mruItems];
self.mruSearchItems = tmpArray;
[tmpArray release];

再次编辑

财产中“保留”实际上有什么作用?

以mruSearchItems为例,当你指定它时:

- (void)setMruSearchItems:(NSArray *)newArray
{
    [newArray retain];
    [mruSearchItems release]; // this lines causes a second release to the old value
    mruSearchItems = newArray;
}

答案 1 :(得分:1)

为什么需要释放对象并重新分配?如果您将mruSearchItems设为NSMutableArray,则只需致电:

[mruSearchItems removeAllObjects];
[mruSearchItems addObjectsFromArray:self.mruItems];

希望这会有所帮助

答案 2 :(得分:0)

我认为你在发布array.i时遇到问题希望这会对你有帮助

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{

NSString *searchString = [self.mruSearchItems objectAtIndex:indexPath.row];
 [self.mruSearchItems removeObjectAtIndex:searchString]
[self.searchTableView reloadData];

}