2011-10-31 106 views
1

我已经通过委托将NSArray值传递回父视图。- [__ NSArrayI isEqualToString:]:发送到已释放实例的消息

其被接收在父视图,像这样

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

如果我是执行此代码,并选择它显然执行委托childview的的TableCell但然后冻结向上和火灾此错误的日志

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; 
+0

你的其中一把钥匙不是。由于您发布的版本过多,因此它已被释放。 –

+0

代码的其他部分可能存在问题。你有没有在其他地方使用manufactureSearchObjectString? – Bird

+0

是啊我在想同样的事情,现在的错误显示在哪里,我将价值超过一个uilabel像这样** label2.text = manufactureSearchObjectString; **我相信是错误的但不知道如何解决,因为我试图把一个数组放入文本值,我想我需要做isequaltostring什么的? –

回答

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

请注意,我也改变了变量类型的arrayValuesNSDictionary。让我知道这是否适合你。

+0

我传递给它一个数组值,所以我不能改变为nsdictionary。我试过你的代码的复制版本,它仍然有相同的错误...但是现在它突出显示了我的代码的不同部分,如上所述的错误。当我设置我的textfield标签来显示制造价值时,我会去做这件事情......显然它是错的。但我不知道为什么。 ** label2.text = manufactureSearchObjectString; ** –

+0

也许是因为即时通讯它的数组值为字符串? –

1

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

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

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

[arrayValues valueForKey:@"MANUFACTURER"]; 

返回一个数组。

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

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

您需要为manufactureSearchObjectString指定一个字符串值。你需要弄清楚你想要的是什么字符串值。在这种情况下,你的数组中只有一个字符串,所以我想你想要那个。在这种情况下

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

但一般而言,您需要检查是否有数组中的多个值,并且决定你想要哪一个,并检查是否有数组中的任何值,并做一些事情正确处理。

+0

很酷的欢呼,我检查,看看它是否有效,但它的剂量,但我会考虑你的意见,并做更多的阅读。至少目前为止,尽管我知道它可能做我想要实现的事情,但只需要清理它就可以了。 –

0

请将其转换为NSString。

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

它不会崩溃。

相关问题