我的代码如下:
CGRect screenRect = [[UIScreen mainScreen] bounds];
SomeView *infoView;
if(screenRect.size.height != 568.0){
// iPhone 5/5s users crash in the next line
infoView = [[[NSBundle mainBundle] loadNibNamed:@"SomeViews" owner:self options:nil] objectAtIndex:1];
}else{
infoView = [[[NSBundle mainBundle] loadNibNamed:@"SomeViews" owner:self options:nil] objectAtIndex:0]
}
然而,我从Crashlytics获得了一些针对iPhone 5/5s用户的崩溃报告,作为上面代码中的注释。
我很惊讶5/5秒的高度不是568,因为我的应用程序只支持纵向。我有数百个活跃用户,只有12个崩溃发生在4个用户身上。
即使iPhone 5/5s设备加载了错误的笔尖(适用于3.5英寸屏幕),也不应该导致崩溃。(我刚测试过。)
http://crashes.to/s/1ddc169b801
Crashlytics还向我展示了90%的崩溃发生在越狱设备上,这让我想知道越狱设备是否可以以任何方式改变这个值?
Fatal Exception: NSInvalidArgumentException
-[UIDeviceRGBColor superview]: unrecognized selector sent to instance 0x14732db0
0
CoreFoundation
__exceptionPreprocess + 130
1
libobjc.A.dylib
objc_exception_throw + 38
2
CoreFoundation
-[NSObject(NSObject) doesNotRecognizeSelector:] + 202
...
22
UIKit
-[NSBundle(UINSBundleAdditions) loadNibNamed:owner:options:] + 138
23
Banck
BKAddRecordPagingViewController.m line 244 // line 244 is loadNibNamed
-[BKAddRecordPagingViewController viewDidLoad]
崩溃报告链接显示了原因,但我不明白为什么,因为我在nib文件中只使用了内置的UILabel、UIImageView和UITextView。
有人能给我一些建议,让我更好地检查越狱设备上是否使用4英寸屏幕吗?第二个问题是loadNibNamed内部崩溃的原因是什么?
我怀疑Cydia Tweak"Eclipse"有一个过度发布错误。(Eclipse.dylib列在您的崩溃跟踪中)
NIB中UIView的一个实例正在释放,并且内存被重新用于UIDeviceRGBColor
实例。
看看你是否可以用Cydia Eclipse插件重新编程?您可以通过Instruments追踪您的分配情况。
使用UIScreen主屏幕
CGRect screenBounds = [[UIScreen mainScreen] bounds];
if (screenBounds.size.height == 568) {
// code for 4-inch screen
} else {
// code for 3.5-inch screen
}
我认为这与jb无关。
建议1:
- 不要将float等同于568.0f。只需检查它是否大于567且小于1024
建议2:
- 这个代码库有一个非常直接的方法来检测各种iOS设备。——https://github.com/froztbytes/UIDeviceHardware