—[__NSArrayI isEqualToString:]:发送到被释放实例的消息



我已经使用委托将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.
}

如果我要执行这段代码并选择子视图的tablecell它显然会执行委托但随后会冻结并将此错误发送给Log

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.
    }

它没有崩溃,我最终在我的日志中有正确的细节NSLog,像这样。

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

我希望有人经历过这样的问题,这是我的数组对象看起来像,它的值的字典。

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

valueForKey:返回一个自动发布的实例。除非您保留它,否则在您从当前方法返回后,它将被释放。看起来就像你把它赋值给了一个实例变量。如果你这样做,你需要保留它。

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

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

[arrayValues valueForKey:@"MANUFACTURER"];

返回一个数组

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

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

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

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

但通常你需要检查数组中是否有多个值,并决定你想要哪个,还要检查数组中是否没有值,并做一些正确的处理

试着把你的代码改成这样:

- (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

请转换为NSString

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

不会崩溃

最新更新