0

谁能告诉我这段代码之间的功能区别......

for (int i = 0; i < productsJSON.count; i++) { prod = [[Product alloc] init];

   prod.ItemID = [[productsJSON valueForKey:@"ItemID"] objectAtIndex:i];
   prod.Name = [[productsJSON valueForKey:@"Name"] objectAtIndex:i];

   [self.products addObject:prod];

} [超级 viewDidLoad];

...而这段代码...

prod = [[产品分配] init]; prod.ItemID = @"SB4UL"; prod.Name = @"#4 开口螺栓 - UL 认证"; [self.products addObject:prod];

prod = [[产品分配] init]; prod.ItemID = @"PVSC07GGUL"; prod.Name = @"I 梁接地夹,UL"; [self.products addObject:prod];

[超级视图DidLoad];

...当 prod.ItemID 和 prod.Name 是 NSString 属性,并且在“for”循环中分配的值 - 退出循环后 - 被视觉确认与其他代码块分配的值相同?

据我所知,在我实际尝试将结果用于我的应用程序的那一刻之前,两者的行为完全相同。该代码出现在 UITableViewController 的 viewDidLoad 方法中。它被传递给 cellForRowAtIndexPath 方法,在那里我可以确认这些值完好无损地到达。然后我们直接进入代码块......

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ProductCell"]; 产品 *product = [self.products objectAtIndex:indexPath.row]; cell.textLabel.text = 产品名称;

如果我已注释掉第一个块并运行第二个块,则视图将完美显示。

如果我注释掉第二个块并运行第一个块,程序每次都会在“cell.textLabel.text = product.Name”处死掉,并显示一条看似随机的错误消息(例如:“线程 1:EXEC_BAD_INSTRUCTION(代码=EXC_1386_INVOP, subcode=0x0)”或“线程 1:信号 SIGABRT”或“线程 1:EXC_BAD_ACCESS(代码=1,地址=0xf069996f”)。

4

2 回答 2

0

我不太了解您的代码,例如:

prod.ItemID = [[productsJSON valueForKey:@"ItemID"] objectAtIndex:i];

我想 productsJSON 是一个字典,然后:

[productsJSON valueForKey:@"ItemID"]; // <-- is this an array?

第一个疑问:在我看来,这会返回一个字符串?我错了吗?如果我错了

我现在只是在猜测,但我认为您的代码应该是这样的:

for (int i = 0; i < productsJSON.count; i++) { 
  prod = [[Product alloc] init];
  prod.ItemID = [[productsJSON objectAtIndex:i] valueForKey:@"ItemID"];
  prod.Name   = [[productsJSON objectAtIndex:i] valueForKey:@"Name"];
  [self.products addObject:prod];
}
于 2013-01-15T21:00:31.627 回答
0

@Joe 是对的——我只需要深入挖掘才能找到它。该数组是持久的,但 Product 类的属性不是。

productsJSON 代码是特定于 viewDidLoad 的变量。它在方法之间死亡,并且 Product 对象中的引用变坏了。

于 2013-01-16T20:02:39.417 回答