这些代码块如何产生看似相同的结果,以后的功能会有所不同?

时间:2013-01-15 19:59:39

标签: objective-c

有谁能告诉我这段代码之间的功能差异......

  

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];
     

}      [super viewDidLoad];

...而且这段代码......

  

prod = [[Product alloc] init];      prod.ItemID = @“SB4UL”;      prod.Name = @“#4 Split Bolt- UL Approved”;      [self.products addObject:prod];

     

prod = [[Product alloc] init];      prod.ItemID = @“PVSC07GGUL”;      prod.Name = @“I Beam Grounding Clamp,UL”;      [self.products addObject:prod];

     

[super viewDidLoad];

...当prod.ItemID和prod.Name是NSString属性时,在“for”循环中分配的值 - 在退出循环后 - 在视觉上确认与另一个分配的值相同代码块?

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

  

UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@“ProductCell”];      Product * product = [self.products objectAtIndex:indexPath.row];      cell.textLabel.text = product.Name;

如果我已经注释掉了第一个块并运行了第二个块,那么视图就会显示完美。

如果我已注释掉第二个块并运行第一个块,程序每次都会在“cell.textLabel.text = product.Name”中死掉,并且它会显示一个看似随机的错误消息(例如:“Thread 1: EXEC_BAD_INSTRUCTION(code = EXC_1386_INVOP,subcode = 0x0)“或”Thread 1:signal SIGABRT“或”Thread 1:EXC_BAD_ACCESS(code = 1,adress = 0xf069996f“)。

2 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分:0)

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

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