我已经使用委托将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"];
不会崩溃