创建视图时获取EXC_BAD_ACCESS / KERN_INVALID_ADDRESS

时间:2018-11-26 19:04:48

标签: objective-c uiview

我正在创建一个自定义视图,该视图将负责显示一些文本。

BOOL DisplayBiggerString(Item *feedItem, CGFloat contentWidth) {
  StyledString *const tryBiggerString = [feedItem buildBiggerString:[feedItem myStyle]];
  CoreTextView *testTextView = [[CoreTextView alloc] initWithFrame:CGRectMake(0, 0, contentWidth, 0)];
  [testTextView setStyledString:tryBiggerString];
  return testTextView.numberOfLines > 1;
}

似乎在崩溃:

CoreTextView *testTextView = [[CoreTextView alloc] initWithFrame:CGRectMake(0, 0, contentWidth, 0)];

我不确定为什么会导致该视图崩溃。里面的函数只是创建一个新视图,如下所示:

if (self = [super initWithFrame:CGRectMake(0, 0, width, 1)])

我个人无法对此进行复制,因为我只能对收到的崩溃报告做出回应。我检查了contentWidth,它只是获得collectionView的宽度:

CGRectGetWidth(self.collectionView.bounds)

,这是在dispatch_async调用之外完成的,该调用在从缓存中获取字符串时会调整字符串的大小:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ MakeTextCacheWarmup(newObjects, self.dataSource.feedSectionControllerComponents.itemConfiguration, width, width);

是否有某种方法可以通过某些宽度而导致崩溃?我已经测试了所有浮点值,到目前为止,它们似乎还不错。还是在异步块内部创建视图是一个问题?我从不添加视图,而只是用它来确定文本的行数

libobjc.A.dylib objc_msgSend
1CoreFoundation -[__NSSetM addObject:]
2UIKitCore UIViewDidSetNeedsDisplay
3UIKitCore -[UIView _createLayerWithFrame:]
4UIKitCore UIViewCommonInitWithFrame
5UIKitCore -[UIView initWithFrame:]
6MyApp __cmp_gen_92064(MYUserSession+MYMediaUploadManager.m:13)
7+MyApp DisplayBiggerString(MYConsumptionHelpers.m:12)
8+MyApp +[MYFeedItemTextCell buildStyledStringWithFeedItem:feedItemRow:pageCellState:configuration:contentWidth:textWidth:combinedContextOptions:userSession:](MYFeedItemTextCell.m:403)
9+MyApp __cmp_gen_8c7c(MYMainAppViewController.m:174)
10+MyApp MakeTextCacheWarmup(MakeTextCacheWarmup.m:47)
11+MyApp __81-[MYMainFeedViewController feedNetworkSource:didFinishLoadingObjects:withConfig:]_block_invoke.818

1 个答案:

答案 0 :(得分:0)

我在@bbum的帮助下找到了问题。问题在于在非主线程上创建UIView的实例。这导致竞态条件最终导致应用程序崩溃。