#ios #objective-c #crash #crashlytics
#iOS #objective-c #сбой #crashlytics
Вопрос:
Извините, если этот вопрос слишком нечеткий, но я действительно не понимаю, что происходит. У меня есть приложение со встроенной crashlytics
библиотекой. И у меня есть один странный сбой в поле зрения с некоторым сюжетом. Вот журнал: строка 102 является
[path addArcWithCenter:CGPointMake(kLeftHorizontalMargin xScale*i/2, kVerticalTopMargin (maxValue - value)*yScale) radius:kPathLineWidth startAngle:0 endAngle:2*M_PI clockwise:YES];
и еще немного:
Поток: Сбой: com.apple.main-thread
0 libsystem_kernel.dylib 0x3846f1fc __pthread_kill 8
1 libsystem_pthread.dylib 0x384d6a53 pthread_kill 58
2 libsystem_c.dylib 0x3842002d abort 76
3 libsystem_c.dylib 0x383ffc6b __assert_rtn 182
4 CoreGraphics 0x2dc60563 CGPathAddArc 186
5 UIKit 0x30589ed7 -[UIBezierPath addArcWithCenter:radius:startAngle:endAngle:clockwise:] 70
6 Exchange 0x00010d25 -[GraphView drawRect:] (GraphView.m:102)
7 UIKit 0x303cb749 -[UIView(CALayerDelegate) drawLayer:inContext:] 372
8 QuartzCore 0x30002049 -[CALayer drawInContext:] 100
9 QuartzCore 0x2ffeb813 CABackingStoreUpdate_ 1858
10 QuartzCore 0x300c5735 ___ZN2CA5Layer8display_Ev_block_invoke 52
11 QuartzCore 0x2ffeb0c3 x_blame_allocations 82
12 QuartzCore 0x2ffead77 CA::Layer::display_() 1118
13 QuartzCore 0x2ffce969 CA::Layer::display_if_needed(CA::Transaction*) 208
14 QuartzCore 0x2ffce601 CA::Layer::layout_and_display_if_needed(CA::Transaction*) 24
15 QuartzCore 0x2ffce00d CA::Context::commit_transaction(CA::Transaction*) 228
16 QuartzCore 0x2ffcde1f CA::Transaction::commit() 314
17 QuartzCore 0x2ffc7b4d CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) 56
18 CoreFoundation 0x2db90f71 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ 20
19 CoreFoundation 0x2db8e8ff __CFRunLoopDoObservers 286
20 CoreFoundation 0x2db8ec4b __CFRunLoopRun 738
21 CoreFoundation 0x2daf9541 CFRunLoopRunSpecific 524
22 CoreFoundation 0x2daf9323 CFRunLoopRunInMode 106
23 GraphicsServices 0x328302eb GSEventRunModal 138
24 UIKit 0x303b01e5 UIApplicationMain 1136
25 Exchange 0x00022507 main (main.m:16)
И вот мой drawRect:
:
- (void)drawRect:(CGRect)rect
{
[super drawRect:rect];
if (self.datesAndValues.count == 0)
return;
double xScale = (self.frame.size.width - kLeftHorizontalMargin - kRightHorizontalMargin)/((self.datesAndValues.count - 1)/2);
double yScale;
if (maxValue == minValue)
yScale = 1;
else
yScale = (self.frame.size.height - kVerticalTopMargin - kVerticalBottomMargin)/(maxValue - minValue);
[self drawWeekSeparatorsInRect:rect
withXScale:xScale];
UIFont* bigFont = [UIFont fontWithName:@"HelveticaNeue-Light" size:kMinMaxLabelFontSize];
UIFont* smallFont = [UIFont fontWithName:@"HelveticaNeue-Light" size:kLocalMinMaxLabelFontSize];
UIBezierPath* path = [UIBezierPath bezierPath];
for (NSInteger i=0; i<self.datesAndValues.count; i =2)
{
double value = [self.datesAndValues[i 1] doubleValue];
if (i == 0)
[path moveToPoint:CGPointMake(kLeftHorizontalMargin, kVerticalTopMargin (maxValue - value)*yScale)];
else
[path addLineToPoint:CGPointMake(kLeftHorizontalMargin xScale*i/2, kVerticalTopMargin (maxValue - value)*yScale)];
if (i == self.datesAndValues.count - 2)
[path addArcWithCenter:CGPointMake(kLeftHorizontalMargin xScale*i/2, kVerticalTopMargin (maxValue - value)*yScale) radius:kPathLineWidth startAngle:0 endAngle:2*M_PI clockwise:YES];
NSDate* date = self.datesAndValues[i];
if ([self.datesOfMax containsObject:date] amp;amp;
value != maxValue)
{
UIColor* textColor = [UIColor greenColor];
NSDictionary* stringAttrs = @{ NSFontAttributeName : smallFont,
NSForegroundColorAttributeName : textColor };
NSString* maxValueString = [NSString stringWithFormat:@"%.2f", value];
NSAttributedString* attrStr = [[NSAttributedString alloc] initWithString:maxValueString
attributes:stringAttrs];
CGFloat x = kLeftHorizontalMargin xScale*i/2;
CGRect textRect = [maxValueString boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:stringAttrs
context:nil];
if (x textRect.size.width kLeftHorizontalMargin > self.frame.size.width)
x = self.frame.size.width - textRect.size.width - kLeftHorizontalMargin;
[attrStr drawAtPoint:CGPointMake(x, (maxValue - value)*yScale)];
}
if (value == maxValue)
{
UIColor* textColor = [UIColor greenColor];
NSDictionary* stringAttrs = @{ NSFontAttributeName : bigFont,
NSForegroundColorAttributeName : textColor };
NSString* maxValueString = [NSString stringWithFormat:@"%.2f", value];
NSAttributedString* attrStr = [[NSAttributedString alloc] initWithString:maxValueString
attributes:stringAttrs];
CGRect textRect = [maxValueString boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:stringAttrs
context:nil];
CGFloat x = kLeftHorizontalMargin xScale*i/2 - textRect.size.width;
if (x < kLeftHorizontalMargin)
x = kLeftHorizontalMargin;
[attrStr drawAtPoint:CGPointMake(x, kMaxValueVerticalTopMargin (maxValue - value)*yScale)];
}
if ([self.datesOfMin containsObject:date] amp;amp;
value != minValue)
{
UIColor* textColor = [UIColor redColor];
NSDictionary* stringAttrs = @{ NSFontAttributeName : smallFont,
NSForegroundColorAttributeName : textColor };
NSString* minValueString = [NSString stringWithFormat:@"%.2f", value];
NSAttributedString* attrStr = [[NSAttributedString alloc] initWithString:minValueString
attributes:stringAttrs];
CGFloat x = kLeftHorizontalMargin xScale*i/2;
[attrStr drawAtPoint:CGPointMake(x, kVerticalTopMargin (maxValue - value)*yScale)];
}
if (value == minValue)
{
UIColor* textColor = [UIColor redColor];
NSDictionary* stringAttrs = @{ NSFontAttributeName : bigFont,
NSForegroundColorAttributeName : textColor };
NSString* minValueString = [NSString stringWithFormat:@"%.2f", value];
NSAttributedString* attrStr = [[NSAttributedString alloc] initWithString:minValueString
attributes:stringAttrs];
CGFloat x = kLeftHorizontalMargin xScale*i/2;
CGRect textRect = [minValueString boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:stringAttrs
context:nil];
if (x textRect.size.width kLeftHorizontalMargin > self.frame.size.width)
x = self.frame.size.width - textRect.size.width - kLeftHorizontalMargin;
[attrStr drawAtPoint:CGPointMake(x, kVerticalTopMargin (maxValue - value)*yScale)];
}
}
path.lineWidth = kPathLineWidth;
[[UIColor lightGrayColor] setStroke];
[path stroke];
}
Комментарии:
1. Сгенерирован какой-либо текст исключения?
2. Какой журнал вас интересует? Я думаю, проблема в
addArcWithCenter:radius:startAngle:endAngle:clockwise:
3. Предоставленные вами журналы в порядке, но часто генерируются сообщения об исключениях, если вы продолжаете выполнение после обнаружения исключения. Возможно, к вам это не относится, но это сообщение часто бывает более полезным, чем трассировка стека.
4. @trojanfoe, я не смог вызвать этот сбой при отладке. У меня есть только отчет crashlytics
5. ОК. Укажите, какая строка равна 102.
Ответ №1:
Ваш код вылетает, если у вас есть только одна пара дата / значение в self.datesAndValues
. Посмотрите на эту строку:
double xScale = (self.frame.size.width - kLeftHorizontalMargin - kRightHorizontalMargin)/((self.datesAndValues.count - 1)/2);
Если self.datesAndValues
имеет значение 2, результирующее значение для XScale равно, Inf
потому что ((self.datesAndValues.count - 1)/2)
будет равно 0.
Комментарии:
1. Вау, спасибо тебе! Я попытаюсь смоделировать этот случай, добавив accept answer