2

我面临一个奇怪的问题,这很常见,可能会在许多站点上浮动,但这有点奇怪。我正在分配可变数组对象使用对象,然后像我一样释放并且每次分配和释放对象时都这样做。当我评论发布行并仅使用 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];
}

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

4

2 回答 2

3

无需分配初始化并释放您的阵列。

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

为此,请删除这些行并仅标记您的数组:

 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

此方法适用于ARCNon-ARC

希望这可以帮助。

于 2013-09-03T07:50:58.423 回答
2

首先你初始化数组变量

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

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

array= [[dbSingleton sharedInstance] getAll_Players];

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

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

-(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]' 返回的指针。该行中的引用计数既不会增加也不会减少,因此您也不应该减少它。(并且永远不要相信任何对象的保留计数值,因为对象并不总是在您期望它们时释放)。

只有在创建对象和在对象上调用保留时调用allocnewcopymutableCopy时,引用计数才会增加,并且只有当您自己使用这些关键字时,才应该释放或自动释放对象。请注意,此关键字会增加 RF 计数。其中releaseautorelease会减少 RF 计数。

预期 Objective-c 的做法是确保任何返回对象的函数都返回一个保留计数为 0 的对象,除非函数名称在其名称中包含上述关键字之一。(你当然应该在返回对象之前调用“autorelease”而不是“release”)

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

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

于 2013-09-03T07:46:03.490 回答