应用程序在xcode中的数组对象上发布时会崩溃

时间:2013-09-03 07:37:58

标签: iphone ios xcode release

我面临着一个奇怪的问题,这个问题很常见,可能会在很多网站上浮动,但这有点奇怪。我正在分配可变数组对象使用对象然后像我一样释放并且每次分配和释放对象时都会执行。当我评论释放线并且只使用nil时,它工作正常。以下是我的代码,请查看并建议我更好的方法。

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    NSMutableArray * array = [[NSMutableArray alloc] init];
    array= [[dbSingleton sharedInstance] getAll_Players];
    NSMutableDictionary * dict = [array objectAtIndex:row];
    NSString * autoID = [dict objectForKey:@"autoId"];
    NSLog(@"%@",[NSString stringWithFormat:@"%@ %@",[dict valueForKey:@"fName"],[dict valueForKey:@"lName"]]);
    [array release];
}

请不要减少我的观点,因为这很常见,人们不能不喜欢这些问题。提前谢谢。

2 个答案:

答案 0 :(得分:3)

无需alloc-init并释放您的数组。

我猜您不需要具有相同内容的新数组,而只需要引用您的sharedInstance数组。

为此,删除这些行并仅对您的数组进行decalre:

 NSMutableArray *array = [[dbSingleton sharedInstance] getAll_Players];

由于此处没有alloc-init任何数组,因此无需释放相同的数组。因此,不需要内存问题。

对于最大值,要减少引用计数,您可以做的是,当它完成引用时,立即使该引用无效:

    NSMutableArray * array= [[dbSingleton sharedInstance] getAll_Players];
    NSMutableDictionary * dict = [array objectAtIndex:row];
    NSString * autoID = [dict objectForKey:@"autoId"];
    NSLog(@"%@",[NSString stringWithFormat:@"%@ %@",[dict valueForKey:@"fName"],[dict valueForKey:@"lName"]]);
    array = nil;  // not mandatory, it will work without this line as well

此方法适用于 ARC 非ARC

希望这有帮助。

答案 1 :(得分:2)

首先初始化数组变量

NSMutableArray * array = [[NSMutableArray alloc] init];

在这一点上,你应该在某个时候释放这个变量。 但是,当你写作

array= [[dbSingleton sharedInstance] getAll_Players];

你覆盖你刚刚分配的数组变量,而数组现在不是你应该在这里释放的东西,除非你也在从getAll_Players获得的数组上调用retain。

要解决此问题,您应该这样做:

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
NSMutableArray * array = [[dbSingleton sharedInstance] getAll_Players];
NSMutableDictionary * dict = [array objectAtIndex:row];
NSString * autoID = [dict objectForKey:@"autoId"];
NSLog(@"%@",[NSString stringWithFormat:@"%@ %@",[dict valueForKey:@"fName"],[dict valueForKey:@"lName"]]);
}

编辑:(作为评论中问题的答案)

NSMutableArray * array = [[dbSingleton sharedInstance] getAll_Players];  

上面的行只是将变量'array'设置为指向'[[dbSingleton sharedInstance] getAll_Players]'返回的指针。引用计数在该行中不会增加也不会减少,因此您也不应减少它。 (并且永远不要相信任何对象的保留计数值,因为对象并不总是在您期望它们时释放。)

只有在创建对象时调用 alloc new copy mutableCopy 时才会增加引用计数并且在对象上调用保留,并且只有当您自己使用这些关键字时,才应该释放或自动释放对象。请注意,此关键字会增加RF计数。 发布 autorelease 会减少RF计数。

预期objective-c实践确保返回对象的任何函数返回一个保留计数为0的对象,除非函数名称在其名称中包含上述关键字之一。 (当然,在返回之前你应该在对象上调用'autorelease'并且不要'释放')

当你使用其中一个关键词时,接收者应该期望一个rf计数为1,并且接收者确保在他或她完成后释放该对象。

这也是您对任何内置函数的期望。 这就是为什么你不应该从上面的行释放对象'array'。