- [__ NSArrayI isEqualToString:]:发送到解除分配实例的消息

时间:2011-10-31 01:14:51

标签: iphone ios uitableview delegates

我已使用委托将NSArray值传递回父视图。

它在父视图中收到,如此

- (void) setManufactureSearchFields:(NSArray *)arrayValues withIndexPath:(NSIndexPath *)myIndexPath
{
    manufactureSearchObjectString = [arrayValues valueForKey:@"MANUFACTURER"];
    NSLog(@"%@",[arrayValues valueForKey:@"MANUFACTURER"]);
    manufactureResultIndexPath = myIndexPath;
    [self.tableView reloadData]; //reloads the tabels so you can see the value in the tableViewCell.
}

如果我要执行此代码并选择子视图的表格单元格,它显然会执行委托但随后冻结并将此错误激发到日志

2011-10-31 14:06:16.670 code[12610:207] (
    "Alfa Romeo"
)
2011-10-31 14:06:16.673 code[12610:207] *** -[__NSArrayI isEqualToString:]: message sent to deallocated instance 0x6859280

但是,如果我在委托方法中注释掉以下行

   - (void) setManufactureSearchFields:(NSArray *)arrayValues withIndexPath:(NSIndexPath *)myIndexPath
    {
        //manufactureSearchObjectString = [arrayValues valueForKey:@"MANUFACTURER"];
        NSLog(@"%@",[arrayValues valueForKey:@"MANUFACTURER"]);
        manufactureResultIndexPath = myIndexPath;
        [self.tableView reloadData]; //reloads the tabels so you can see the value in the tableViewCell.
    }

它不会崩溃,我最终会在日志中找到正确的详细信息。

2011-10-31 14:09:28.200 code[12737:207] (
    Sony
)

我希望有人之前遇到过这样的问题,这就是我的数组对象的样子,它是一个价值字典。

ISELECT = F;
ISALIVE = T;
MANUFACTURER = Sony;
MANUFACTURERID = 3;

3 个答案:

答案 0 :(得分:1)

valueForKey:返回一个自动释放的实例。除非您保留它,否则在从当前方法返回后,您可以预期它将被释放。看起来您正在将其分配给实例变量。如果你这样做,你需要保留它。

manufactureSearchObjectString = [arrayValues valueForKey:@"MANUFACTURER"];
[manufactureSearchObjectString retain];

但看起来你还有另一个问题。

[arrayValues valueForKey:@"MANUFACTURER"];

返回一个数组。

manufactureSearchObjectString = [arrayValues valueForKey:@"MANUFACTURER"];

通过变量的名称,看起来好像是将它分配给字符串变量。因此,如果您修复了保留问题,那么您将遇到另一个错误。当你试图在它上面调用isEqualToString时,你会得到一个无法识别的选择器。

您需要为manufactSearchObjectString分配一个字符串值。你需要找出你想要的字符串值。在这种情况下,你的数组中只有一个字符串,所以我想你想要那个。在那种情况下

manufactureSearchObjectString = [[arrayValues valueForKey:@"MANUFACTURER"] objectAtIndex:0];
[manufactureSearchObjectString retain];

但一般来说,你需要检查数组中是否有多个值,并确定你想要哪一个,并检查数组中是否没有值,并做正确处理的事情。

答案 1 :(得分:0)

尝试将代码更改为:

- (void) setManufactureSearchFields:(NSDictionary *)arrayValues withIndexPath:(NSIndexPath *)myIndexPath
{
    manufactureSearchObjectString = [[arrayValues valueForKey:@"MANUFACTURER"] copy];
    NSLog(@"%@",[arrayValues valueForKey:@"MANUFACTURER"]);
    manufactureResultIndexPath = myIndexPath;
    [self.tableView reloadData]; //reloads the tabels so you can see the value in the tableViewCell.
}

请注意,我还将arrayValues的变量类型更改为NSDictionary。如果这对您有用,请告诉我。

答案 2 :(得分:0)

请将其转换为NSString。

 NSString *manufact=[NSString stringWithFormat:@"%@",[arrayValues valueForKey:@"MANUFACTURER"];

它不会崩溃。