【问题标题】:iPhone app crash: UIKitiPhone 应用程序崩溃:UIKit
【发布时间】:2016-01-25 08:59:16
【问题描述】:

2015 年 10 月 29 日更新:可能已经找到了原因。我正在根据this StackOverflow post 创建一个渐变层 - 它对我和我测试过的其他所有人都非常有效,但其他人可能会遇到问题吗?

CAGradientLayer * g  = [CAGradientLayer layer];
UIColor * colourFrom = [UIColor colorWithRed:0.1 green:0.7 blue:0.3  alpha:1.0];
UIColor * colourTo   = [UIColor colorWithRed:0.1 green:0.8 blue:0.4 alpha:1.0];

g.frame        = self.view.bounds;
g.cornerRadius = 10;
g.startPoint   = CGPointMake(0.0, 0.5);
g.endPoint     = CGPointMake(1.0, 0.5);
g.colors       = [NSArray arrayWithObjects:(id)[colourFrom CGColor],
                                           (id)[colourTo CGColor],
                                           nil];

2015 年 10 月 27 日更新:仍然看到这些崩溃来自 Crashlytics。


2015 年 10 月 26 日更新:我发现 this thread on StackOverflow 似乎与我遇到的问题完全相同(但没有答案..),但是他们使用的是 Facebook/Twitter 操作表我不是。只是为了帮助诊断问题。


刚刚在 App Store 上发布了一款应用,我们发现有一小部分用户 (~2%) 在 Crashlytics 中遇到了这次崩溃:

它似乎只出现在 iOS 9 上,但它出现在 所有设备 上。

致命异常:NSInternalInconsistencyException 在这种情况下仅支持 RGBA 或白色空间。

就我个人而言,我使用的是 9.1 的 iPhone 6,但没有遇到此问题。我也在模拟器中尝试过,同样没有问题,所以我不确定这个错误是如何出现的。 Crashlytics 的堆栈跟踪如下。

似乎 UIColor 被添加到 NSDictionary 而不被编码,但我没有在应用程序的任何地方这样做。似乎它也可能与UIRemoteViewController 有关,但我没有在应用程序中使用它(除非用 Facebook 登录导致 - 我曾尝试在手机和模拟器上用 Facebook 登录,但又一次我无法让这个错误出现)。

有人知道是什么原因造成的吗?


Thread : Fatal Exception: NSInternalInconsistencyException
0  CoreFoundation                 6512725832 __exceptionPreprocess
1  libobjc.A.dylib                6869942144 objc_exception_throw
2  CoreFoundation                 6512725528 +[NSException raise:format:]
3  Foundation                     6528403996 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:]
4  UIKit                          6606881444 -[UIColor encodeWithCoder:]
5  Foundation                     6528169072 _encodeObject
6  Foundation                     6528197336 +[NSKeyedArchiver archivedDataWithRootObject:]
7  UIKit                          6609904352 -[_UIAppearanceRecorder _recordInvocation:withClassName:containerClassNames:traitCollection:selectorString:forRemoteProcess:]
8  UIKit                          6609884356 __54+[_UIAppearance _recordersExcludingSource:withWindow:]_block_invoke
9  CoreFoundation                 6511594744 __65-[__NSDictionaryM enumerateKeysAndObjectsWithOptions:usingBlock:]_block_invoke
10 CoreFoundation                 6511594448 -[__NSDictionaryM enumerateKeysAndObjectsWithOptions:usingBlock:]
11 UIKit                          6609883592 +[_UIAppearance _recordersExcludingSource:withWindow:]
12 UIKit                          6611900724 UIViewServiceCurrentAppearanceSerializedRepresentations
13 UIKit                          6610654700 +[_UIRemoteViewController _requestViewController:traitCollection:fromServiceWithBundleIdentifier:service:connectionHandler:]
14 UIKit                          6610654160 +[_UIRemoteViewController requestViewControllerWithService:connectionHandler:]
15 UIKit                          6609355772 __117-[NSExtension(UIViewControllerAdditions) instantiateViewControllerWithInputItems:listenerEndpoint:connectionHandler:]_block_invoke_2
16 libdispatch.dylib              6878402280 _dispatch_call_block_and_release
17 libdispatch.dylib              6878402216 _dispatch_client_callout
18 libdispatch.dylib              6878424496 _dispatch_main_queue_callback_4CF
19 CoreFoundation                 6512427512 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__
20 CoreFoundation                 6512418912 __CFRunLoopRun
21 CoreFoundation                 6511561888 CFRunLoopRunSpecific
22 GraphicsServices               6701891720 GSEventRunModal
23 UIKit                          6602887164 UIApplicationMain
24 MyApp                          4296179280 main (main.m:16)
25 libdyld.dylib                  6878603448 start

更新代码示例

这在application:didFinishLaunchingWithOptions中被调用:

// Make the app look pretty
// Turn the status bar color white
[[UIApplication sharedApplication] setStatusBarHidden:NO];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
// Nav bar: Background colour
[[UINavigationBar appearance] setBarTintColor:[UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0]];
// Nav bar: White text
[[UINavigationBar appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor colorWithRed:0.2 green:0.2 blue:0.2 alpha:1.0], NSForegroundColorAttributeName, nil]];
// Nav bar: Tint colour
[UINavigationBar appearance].tintColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"TintNavBar"]];
// Tab Bar: Background color
[[UITabBar appearance] setBarTintColor:[UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0]];
// Tab bar: Tint colour
[UITabBar appearance].tintColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"gradientSmall"]];
// UIControlSegment: Change the colours to just white
// @url https://stackoverflow.com/a/21484829/4027036
[[UISegmentedControl appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:[Ui getColour:UI_BODY_PRIMARY]}
                                               forState:UIControlStateNormal];

【问题讨论】:

  • 你能发布你遇到这个崩溃的代码行吗?
  • @Sujania 不,因为我不确定它的实际来源——我无法重现它,而且堆栈跟踪也没有指明在哪里。
  • 根据我的阅读,这是 UIApperence 或 [UIColor colorWithPatternImage:] 的错误

标签: ios objective-c iphone uikit


【解决方案1】:

根据我的阅读,这是 iOS 6 中 UIApperence 或 [UIColor colorWithPatternImage:] 的错误

所以在你的代码中检查一下。如果您的应用中有该代码,请使用纯色。

以下是我得出这个结论的几个链接:

1) IOS erro at Posting to Facebook with the native Share dialog - UICGColor encodeWithCoder

2)UIApperance and various crashes

3)UIApperance and various crashes

4)iOS 6 MFMailComposeViewController: Only support RGBA or the White color space, this method is a hack

【讨论】:

  • 有可能,我在 UIApperence 中设置了 colorWithPatternImage……但是该应用程序仅在 iOS 7+ 上可用,Crashlytics 报告它仅在 iOS 9 设备(9.0、9.0. 2 和 9.1)。
  • 请您发布一些关于您正在为哪个控件设置 UIAppearance 的代码。您可以尝试像这样设置外观。 [[UINavigationBar 外观] setBackgroundImage:[UIImage imageNamed:@"nav_bar"] forBarMetrics:UIBarMetricsDefault];
  • 当然,已经修改了我原来的帖子 - 它在底部。
  • 您可以尝试使用 colorwithRGB 代替 colorWithPatternImage 并检查应用程序是否崩溃?
  • 嗯,是的,我可以。问题是我没有在任何我可以接触到的设备上遇到崩溃。我必须将代码更改推送到 App Store,看看会发生什么。我得看看设计师/老板是否乐意尝试这个实验一周。
【解决方案2】:

您的问题是无法通过 NSCoding 的 UIColor's 实现对图案颜色进行编码。他们的色彩空间是kCGColorSpaceModelPattern,正如消息中所说,它破坏了NSCoding,因此是不允许的。

这可以通过运行以下代码简单地证明:

UIColor* color = [UIColor colorWithPatternImage:[UIImage imageNamed:@"whatever"]];
NSData* data = [NSKeyedArchiver archivedDataWithRootObject:color];

这在[UIColor encodeWithCoder] 中发生了同样的断言失败。

至于为什么要对UIColors 进行编码,这还不是很清楚。很可能与_UIAppearanceRecorder 有关,但天知道是什么。停止使用图案颜色就可以了。

【讨论】:

    猜你喜欢
    • 2011-06-20
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 2011-10-06
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多