我有一个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;
< - 调试器点在这里
答案 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];
}