– :发送到解除分配的实例的消息
我已使用委托将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;
valueForKey:
返回一个自动释放的实例。 除非您保留它,否则在从当前方法返回后,您可以预期它将被释放。 看起来您正在将其分配给实例变量。 如果你这样做,你需要保留它。
manufactureSearchObjectString = [arrayValues valueForKey:@"MANUFACTURER"]; [manufactureSearchObjectString retain];
但看起来你还有另外一个问题。
[arrayValues valueForKey:@"MANUFACTURER"];
返回一个数组。
manufactureSearchObjectString = [arrayValues valueForKey:@"MANUFACTURER"];
通过变量的名称,看起来好像是将它分配给字符串变量。 因此,如果您修复了保留问题,那么您将遇到另一个错误。 当您尝试在其上调用isEqualToString时,您将获得一个无法识别的选择器。
您需要为manufacturingSearchObjectString分配一个字符串值。 你需要弄清楚你想要的字符串值。 在这种情况下,你的数组中只有一个字符串,所以我猜你想要那个。 在这种情况下
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
的变量类型arrayValues
为NSDictionary
。 如果这对您有用,请告诉我。
请将其转换为NSString。
NSString *manufact=[NSString stringWithFormat:@"%@",[arrayValues valueForKey:@"MANUFACTURER"];
它不会崩溃。