在iOS设备(但不是模拟器)上运行时从CGRectMake获取异常

问题描述:

我发生了一个我无法弄清楚的异常。我在这里有这样的代码:在iOS设备(但不是模拟器)上运行时从CGRectMake获取异常

newControllers = [[NSMutableArray alloc] initWithCapacity:9]; // Only allocate what we need 


    // Ok, add the new thumb UIs 
    for (int i = 0; i < 3; ++i) { 

     for (int j = 0; j < 3; ++j) { 

      // Create the view controller 
      ThumbViewController *newThumbVC = [[ThumbViewController alloc] 
                initWithNibName:@"NewThumbDisplayView" bundle:nil]; 
      // Set the info 
      newThumbVC.localInfo = [newInfo objectAtIndex:(i * 3) + j]; 

      // Place it properly 
      [self.scrollViewContent addSubview:newThumbVC.view]; 
      CGRect rect = CGRectMake(8 + (j * 99), 363 + (i * 134), 106, 142); 
      newThumbVC.view.frame = rect; 
      [self.scrollViewContent bringSubviewToFront:newThumbVC.view]; 

      [newControllers addObject:newThumbVC]; 
     } 
    } 

在模拟器上运行时,它的工作原理非常完美。今天早上我试着在我的手机上运行它,当用下面的堆栈调用CGRectMake时,我得到一个异常(请注意,在输出窗口中没有任何内容会打印出来,这使得更难以找出)。

线程1,队列:com.apple.main线程

#0 0x35220238 in objc_exception_throw() 
    #1 0x3751b788 in +[NSException raise:format:arguments:]() 

如果有人能指出我究竟是不是在这里,我将非常感激。

+0

你可以用常量替换传递给CGRectMake的计算值,看看你是否仍然得到异常?只需确保尝试使用浮点数而不是整数。 –

原来这是我的设备上的iOS版本与我运行的XCode版本之间版本不匹配的问题。更新XCode处理所有事情。

我觉得你看到了构建ThumbViewController的视图时的竞态条件,它是在加载nib之后懒散地构建的。我认为当你将新的vc视图添加为子视图时,会发生崩溃,在模拟器上它可能会快速构建为非零。

该SDK不会鼓励多个VC同时负责(只有少数例外,如MPMoviePlayerController)。你真的需要风投的拇指吗?就在名字旁边,他们听起来更像是意见。

如果您必须使用VC,那么您需要将它们的行/列传递给它们,并让它们自己在viewDidLoad(或更高版本)中自行架设。

+0

事实上,原来我手机上的iOS版本与我的Xcode版本之间不匹配。所以,这些并不是像页面一样的“真实”视图控制器。如果您需要管理数据交换和其视图上的呈现,这些都是一种小型视图控制器。 – Jason

+0

因此,阅读这篇文章后,我研究了嵌入多个VC的一般用例。所以是的,每个人似乎都建议不要这样做,所以我已经将拇指类改为从UIView派生而来。谢谢你的提示。 – Jason

CGRectMake只是一个宏,所以它不是问题。你真的只需要一个视图控制器,并让它管理一组视图,而不是拥有一组控制器。拥有多个控制器是非常不鼓励的。

+0

请参阅上面:)这是我的设备上的iOS版本和我的xcode版本之间的不匹配。 – Jason

+0

另外,感谢关​​于多个视图控制器的提示是一件坏事。我已经改变了我的实现,我的拇指现在都是UIViews。 – Jason