IOS8 - [UIlabel sizeToFit] causes EXC_BAD_ACCESS KERN_INVALID_ADDRESS to crash

Our users experience repeated failures in the method below. A failure always occurs on one of the lines: [lbl sizeToFit] (the lbl variable is reinitialized and reused. As far as I understand, this should not cause any problems).

These crashes only happen on iOS8 (the same method has been used for a very long time on ios7 without any problems). I could not recreate this catastrophe. Currently my only guide is the appletoFit documentation:

.. In some cases, if the view does not have a supervisor, it may be limited to the borders of the screen. Thus, if you want this view to be sized for its parent view, you must add it to the parent view before calling this method.

However, I do not see how this can cause memory errors.

 -(void)setUpHeaders:(NSInteger)fortype{ headers = [NSMutableArray array]; if(fortype == GROUP_BY_TIME){ for(int i=0;i<4;i++){ UIView* header = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 68)]; header.backgroundColor = [UIColor whiteColor]; [headers addObject:header]; } int today = (int)[NSDate dayOfTheWeekOfDate:[NSDate date]]; int firstDayOfTheWeek = (int)[defaults integerForKey:FIRST_DAY_IF_THE_WEEK_KEY]; NSString* restOfTheWeek = nil; if(today == ((firstDayOfTheWeek + 4) % 7) + 1) restOfTheWeek = MyLocalizedString(@"THE COMING WEEK", @"THE COMING WEEK") ; else if(today == ((firstDayOfTheWeek + 5) % 7) + 1) restOfTheWeek = MyLocalizedString(@"REST OF NEXT WEEK", @"REST OF NEXT WEEK") ; else restOfTheWeek = MyLocalizedString(@"REST OF THE WEEK", @"REST OF THE WEEK") ; UILabel* lbl = [[UILabel alloc] initWithFrame:CGRectMake(10, 38, 300, 30)]; lbl.tag = 22; lbl.font = XX_LARGE_VOLKS_FONT; [lbl setBackgroundColor:[UIColor clearColor]]; [lbl setTextColor:[UIColor darkGrayColor]]; [lbl setText:MyLocalizedString(@"TODAY", @"TODAY") ]; [lbl sizeToFit]; [[headers objectAtIndex:0] addSubview:lbl]; lbl = [[UILabel alloc] initWithFrame:CGRectMake([MyLocalizedString(@"TODAY", @"TODAY") sizeWithFont:[UIFont fontWithName:@"Volkswagen-Serial-Medium-Regular" size:21]].width + 15, 41, 300, 30)]; lbl.tag = 2; lbl.font = [UIFont fontWithName:@"Volkswagen-Regular" size:19]; [lbl setBackgroundColor:[UIColor clearColor]]; [lbl setTextColor:[UIColor darkGrayColor]]; NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]]; [lbl setText:[NSString stringWithFormat:@" %@, %@ %d ",[[[NSLocale currentLocale] localeIdentifier] containSubString:@"he"] ? [[[NSDate date] dayOfTheWeekString] uppercaseString] : [[[NSDate date] threeLetterDayOfTheWeekString] uppercaseString],[NSDate abbriviatedMonthForDate:[NSDate date]],(int)[components day]]]; lbl.textAlignment = NSTextAlignmentCenter; [lbl sizeToFit]; [[headers objectAtIndex:0] addSubview:lbl]; UIImageView *img; img = [[UIImageView alloc] initWithFrame:CGRectMake(0, 67, 320, 1)]; [img setBackgroundColor:[UIColor darkGrayColor]]; img.alpha = 0.5; img.tag = 3; [[headers objectAtIndex:0] addSubview:img]; img = [[UIImageView alloc] initWithFrame:CGRectMake(lbl.frame.origin.x+2, 40, 1, 19)]; [img setBackgroundColor:[UIColor darkGrayColor]]; img.alpha = 0.5; img.tag = 33; [[headers objectAtIndex:0] addSubview:img]; lbl = [[UILabel alloc] initWithFrame:CGRectMake(10, 38, 300, 30)]; lbl.tag = 22; lbl.font = XX_LARGE_VOLKS_FONT; [lbl setBackgroundColor:[UIColor clearColor]]; [lbl setTextColor:[UIColor darkGrayColor]]; [lbl setText:MyLocalizedString(@"TOMORROW", @"TOMORROW")]; [lbl sizeToFit]; [[headers objectAtIndex:1] addSubview:lbl]; lbl = [[UILabel alloc] initWithFrame:CGRectMake([MyLocalizedString(@"TOMORROW", @"TOMORROW") sizeWithFont:[UIFont fontWithName:@"Volkswagen-Serial-Medium-Regular" size:21]].width + 15, 41, 200, 30)]; lbl.tag = 2; lbl.font = [UIFont fontWithName:@"Volkswagen-Regular" size:19]; [lbl setBackgroundColor:[UIColor clearColor]]; [lbl setTextColor:[UIColor darkGrayColor]]; components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate dateWithTimeIntervalSinceNow:86400]]; [lbl setText:[NSString stringWithFormat:@" %@, %@ %d ",[[[NSLocale currentLocale] localeIdentifier] containSubString:@"he"] ? [[[[NSDate date] dateByAddingDays:1] dayOfTheWeekString] uppercaseString] : [[[[NSDate date] dateByAddingDays:1] threeLetterDayOfTheWeekString] uppercaseString],[NSDate abbriviatedMonthForDate:[[NSDate date] dateByAddingDays:1]],(int)[components day]]]; lbl.textAlignment = NSTextAlignmentCenter; [lbl sizeToFit]; [[headers objectAtIndex:1] addSubview:lbl]; img = [[UIImageView alloc] initWithFrame:CGRectMake(0, 67, 320, 1)]; [img setBackgroundColor:[UIColor darkGrayColor]]; img.alpha = 0.5; img.tag = 3; [[headers objectAtIndex:1] addSubview:img]; img = [[UIImageView alloc] initWithFrame:CGRectMake(lbl.frame.origin.x+2, 40, 1, 19)]; [img setBackgroundColor:[UIColor darkGrayColor]]; img.alpha = 0.5; img.tag = 33; [[headers objectAtIndex:1] addSubview:img]; lbl = [[UILabel alloc] initWithFrame:CGRectMake(10, 38, 300, 30)]; lbl.tag = 2; lbl.font = XX_LARGE_VOLKS_FONT; [lbl setBackgroundColor:[UIColor clearColor]]; [lbl setTextColor:[UIColor darkGrayColor]]; [lbl setText:restOfTheWeek]; [[headers objectAtIndex:2] addSubview:lbl]; img = [[UIImageView alloc] initWithFrame:CGRectMake(0, 67, 320, 1)]; [img setBackgroundColor:[UIColor darkGrayColor]]; img.alpha = 0.5; img.tag = 3; [[headers objectAtIndex:2] addSubview:img]; lbl = [[UILabel alloc] initWithFrame:CGRectMake(10, 38, 300, 30)]; lbl.tag = 2; lbl.font = XX_LARGE_VOLKS_FONT; [lbl setBackgroundColor:[UIColor clearColor]]; [lbl setTextColor:[UIColor darkGrayColor]]; [lbl setText:MyLocalizedString(@"LATER", @"LATER")]; [[headers objectAtIndex:3] addSubview:lbl]; img = [[UIImageView alloc] initWithFrame:CGRectMake(0, 67, 320, 1)]; [img setBackgroundColor:[UIColor darkGrayColor]]; img.alpha = 0.5; img.tag = 3; [[headers objectAtIndex:3] addSubview:img]; lbl = (UILabel*)[[headers objectAtIndex:0] viewWithTag:2]; todayWeather = [[UIImageView alloc] initWithFrame:CGRectMake(lbl.frame.size.width + lbl.frame.origin.x-5, 38, 30, 25)]; [[headers objectAtIndex:0] addSubview:todayWeather]; lbl = (UILabel*)[[headers objectAtIndex:1] viewWithTag:2]; tomorrowWeather = [[UIImageView alloc] initWithFrame:CGRectMake(lbl.frame.size.width + lbl.frame.origin.x-5, 38, 30, 25)]; [[headers objectAtIndex:1] addSubview:tomorrowWeather]; [self gotWeather]; } else{ NSMutableArray* labels = [[self getLabels] valueForKey:@"values"]; CGRect headerFrame, labelFrame, seperatorFrame; if ([defaults integerForKey:DISPLAY_TYPE]==DisplayTypeNotes) { headerFrame = CGRectMake(0, 0, 320, 60); labelFrame = CGRectMake(10, 30, 300, 30); seperatorFrame = CGRectMake(0, 59, 320, 1); }else{ headerFrame = CGRectMake(0, 0, 320, 68); labelFrame = CGRectMake(10, 38, 300, 30); seperatorFrame = CGRectMake(0, 67, 320, 1); } for(int i=0;i<[labels count];i++){ UIView* header = [[UIView alloc] initWithFrame:headerFrame]; header.backgroundColor = [UIColor whiteColor]; UILabel* lbl = [[UILabel alloc] initWithFrame:labelFrame]; lbl.tag = 2; lbl.font = XX_LARGE_VOLKS_FONT; [lbl setBackgroundColor:[UIColor clearColor]]; [lbl setTextColor:[UIColor darkGrayColor]]; [lbl setText:[labels objectAtIndex:i]]; [header addSubview:lbl]; UIImageView *img; img = [[UIImageView alloc] initWithFrame:seperatorFrame]; [img setBackgroundColor:[UIColor darkGrayColor]]; img.alpha = 0.5; img.tag = 3; [header addSubview:img]; [header bringSubviewToFront:lbl]; [headers addObject:header]; } //add aditonale header for unlabeled tasks\notes UIView* header = [[UIView alloc] initWithFrame:headerFrame]; header.backgroundColor = [UIColor whiteColor]; UILabel* lbl = [[UILabel alloc] initWithFrame:labelFrame]; lbl.tag = 2; lbl.font = XX_LARGE_VOLKS_FONT; [lbl setBackgroundColor:[UIColor clearColor]]; [lbl setTextColor:[UIColor darkGrayColor]]; [lbl setText:MyLocalizedString(@"Not Labeled", @"Not Labeled")]; [header addSubview:lbl]; UIImageView *img; img = [[UIImageView alloc] initWithFrame:seperatorFrame]; [img setBackgroundColor:[UIColor darkGrayColor]]; img.alpha = 0.5; img.tag = 3; [header addSubview:img]; [headers insertObject:header atIndex:0]; } } Thread : Crashed: com.apple.main-thread 0 UIKit 0x000000018c4f22a0 -[_UIViewAdditiveAnimationAction runActionForKey:object:arguments:] + 640 1 UIKit 0x000000018c4f228c -[_UIViewAdditiveAnimationAction runActionForKey:object:arguments:] + 620 2 QuartzCore 0x000000018bb80198 CA::Layer::set_bounds(CA::Rect const&, bool) + 408 3 QuartzCore 0x000000018bb7ff78 -[CALayer setBounds:] + 104 4 UIKit 0x000000018c70fa50 -[_UILabelLayer setBounds:] + 56 5 QuartzCore 0x000000018bb80c58 -[CALayer setFrame:] + 488 6 UIKit 0x000000018c70f9e4 -[_UILabelLayer setFrame:] + 56 7 UIKit 0x000000018c22de0c -[UIView(Geometry) setFrame:] + 292 8 UIKit 0x000000018c23d69c -[UILabel setFrame:] + 140 9 UIKit 0x000000018c23ea88 -[UIView(Geometry) sizeToFit] + 248 10 24me 0x00000001001e292c -[ViewController setUpHeaders:] (ViewController.m:3412) 11 24me 0x00000001001dfcac -[ViewController groupByTime] (ViewController.m:3146) 12 24me 0x00000001001df6a0 -[ViewController group] (ViewController.m:3071) 13 Foundation 0x0000000188970ea8 __NSFireDelayedPerform + 424 14 CoreFoundation 0x0000000187a6a210 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 28 15 CoreFoundation 0x0000000187a69ec0 __CFRunLoopDoTimer + 888 16 CoreFoundation 0x0000000187a6790c __CFRunLoopRun + 1372 17 CoreFoundation 0x0000000187995664 CFRunLoopRunSpecific + 396 18 GraphicsServices 0x0000000190acf5a4 GSEventRunModal + 168 19 UIKit 0x000000018c29a4f8 UIApplicationMain + 1488 20 24me 0x00000001000642bc main (main.m:16) 21 libdyld.dylib 0x000000019875ea08 start + 4 
+7
objective-c uilabel ios8 exc-bad-access sizetofit
source share
1 answer

I modified your code a bit and added a comment. Pay attention to the highlighted part.

 -(void)setUpHeaders:(NSInteger)fortype{ headers = [NSMutableArray array]; if(fortype == GROUP_BY_TIME){ for(int i=0;i<4;i++){ UIView* header = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 68)]; header.backgroundColor = [UIColor whiteColor]; [headers addObject:header]; } int today = (int)[NSDate dayOfTheWeekOfDate:[NSDate date]]; int firstDayOfTheWeek = (int)[defaults integerForKey:FIRST_DAY_IF_THE_WEEK_KEY]; NSString* restOfTheWeek = nil; if(today == ((firstDayOfTheWeek + 4) % 7) + 1) restOfTheWeek = MyLocalizedString(@"THE COMING WEEK", @"THE COMING WEEK") ; else if(today == ((firstDayOfTheWeek + 5) % 7) + 1) restOfTheWeek = MyLocalizedString(@"REST OF NEXT WEEK", @"REST OF NEXT WEEK") ; else restOfTheWeek = MyLocalizedString(@"REST OF THE WEEK", @"REST OF THE WEEK") ; UILabel* lbl = [[UILabel alloc] initWithFrame:CGRectMake(10, 38, 300, 30)]; lbl.tag = 22; lbl.font = XX_LARGE_VOLKS_FONT; [lbl setBackgroundColor:[UIColor clearColor]]; [lbl setTextColor:[UIColor darkGrayColor]]; [lbl setText:MyLocalizedString(@"TODAY", @"TODAY") ]; 

[[headers objectAtIndex: 0] addSubview: lbl]; // pay attention to this part [lbl sizeToFit]; // always add a view to its parent object before calling 'sizeToFit' or it will crash

  lbl = [[UILabel alloc] initWithFrame:CGRectMake([MyLocalizedString(@"TODAY", @"TODAY") sizeWithFont:[UIFont fontWithName:@"Volkswagen-Serial-Medium-Regular" size:21]].width + 15, 41, 300, 30)]; lbl.tag = 2; lbl.font = [UIFont fontWithName:@"Volkswagen-Regular" size:19]; [lbl setBackgroundColor:[UIColor clearColor]]; [lbl setTextColor:[UIColor darkGrayColor]]; NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]]; [lbl setText:[NSString stringWithFormat:@" %@, %@ %d ",[[[NSLocale currentLocale] localeIdentifier] containSubString:@"he"] ? [[[NSDate date] dayOfTheWeekString] uppercaseString] : [[[NSDate date] threeLetterDayOfTheWeekString] uppercaseString],[NSDate abbriviatedMonthForDate:[NSDate date]],(int)[components day]]]; lbl.textAlignment = NSTextAlignmentCenter; 

[[headers objectAtIndex: 0] addSubview: lbl]; // pay attention to this part [lbl sizeToFit]; // always add a view to its parent object before calling 'sizeToFit' or it will crash

  UIImageView *img; img = [[UIImageView alloc] initWithFrame:CGRectMake(0, 67, 320, 1)]; [img setBackgroundColor:[UIColor darkGrayColor]]; img.alpha = 0.5; img.tag = 3; [[headers objectAtIndex:0] addSubview:img]; img = [[UIImageView alloc] initWithFrame:CGRectMake(lbl.frame.origin.x+2, 40, 1, 19)]; [img setBackgroundColor:[UIColor darkGrayColor]]; img.alpha = 0.5; img.tag = 33; [[headers objectAtIndex:0] addSubview:img]; lbl = [[UILabel alloc] initWithFrame:CGRectMake(10, 38, 300, 30)]; lbl.tag = 22; lbl.font = XX_LARGE_VOLKS_FONT; [lbl setBackgroundColor:[UIColor clearColor]]; [lbl setTextColor:[UIColor darkGrayColor]]; [lbl setText:MyLocalizedString(@"TOMORROW", @"TOMORROW")]; 

[[headers objectAtIndex: 1] addSubview: lbl]; // pay attention to this part [lbl sizeToFit]; // always add a view to its parent object before calling 'sizeToFit' or it will crash

  lbl = [[UILabel alloc] initWithFrame:CGRectMake([MyLocalizedString(@"TOMORROW", @"TOMORROW") sizeWithFont:[UIFont fontWithName:@"Volkswagen-Serial-Medium-Regular" size:21]].width + 15, 41, 200, 30)]; lbl.tag = 2; lbl.font = [UIFont fontWithName:@"Volkswagen-Regular" size:19]; [lbl setBackgroundColor:[UIColor clearColor]]; [lbl setTextColor:[UIColor darkGrayColor]]; components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate dateWithTimeIntervalSinceNow:86400]]; [lbl setText:[NSString stringWithFormat:@" %@, %@ %d ",[[[NSLocale currentLocale] localeIdentifier] containSubString:@"he"] ? [[[[NSDate date] dateByAddingDays:1] dayOfTheWeekString] uppercaseString] : [[[[NSDate date] dateByAddingDays:1] threeLetterDayOfTheWeekString] uppercaseString],[NSDate abbriviatedMonthForDate:[[NSDate date] dateByAddingDays:1]],(int)[components day]]]; lbl.textAlignment = NSTextAlignmentCenter; 

[[headers objectAtIndex: 1] addSubview: lbl]; // pay attention to this part [lbl sizeToFit]; // always add a view to its parent object before calling 'sizeToFit' or it will crash

  img = [[UIImageView alloc] initWithFrame:CGRectMake(0, 67, 320, 1)]; [img setBackgroundColor:[UIColor darkGrayColor]]; img.alpha = 0.5; img.tag = 3; [[headers objectAtIndex:1] addSubview:img]; img = [[UIImageView alloc] initWithFrame:CGRectMake(lbl.frame.origin.x+2, 40, 1, 19)]; [img setBackgroundColor:[UIColor darkGrayColor]]; img.alpha = 0.5; img.tag = 33; [[headers objectAtIndex:1] addSubview:img]; lbl = [[UILabel alloc] initWithFrame:CGRectMake(10, 38, 300, 30)]; lbl.tag = 2; lbl.font = XX_LARGE_VOLKS_FONT; [lbl setBackgroundColor:[UIColor clearColor]]; [lbl setTextColor:[UIColor darkGrayColor]]; [lbl setText:restOfTheWeek]; [[headers objectAtIndex:2] addSubview:lbl]; img = [[UIImageView alloc] initWithFrame:CGRectMake(0, 67, 320, 1)]; [img setBackgroundColor:[UIColor darkGrayColor]]; img.alpha = 0.5; img.tag = 3; [[headers objectAtIndex:2] addSubview:img]; lbl = [[UILabel alloc] initWithFrame:CGRectMake(10, 38, 300, 30)]; lbl.tag = 2; lbl.font = XX_LARGE_VOLKS_FONT; [lbl setBackgroundColor:[UIColor clearColor]]; [lbl setTextColor:[UIColor darkGrayColor]]; [lbl setText:MyLocalizedString(@"LATER", @"LATER")]; [[headers objectAtIndex:3] addSubview:lbl]; img = [[UIImageView alloc] initWithFrame:CGRectMake(0, 67, 320, 1)]; [img setBackgroundColor:[UIColor darkGrayColor]]; img.alpha = 0.5; img.tag = 3; [[headers objectAtIndex:3] addSubview:img]; lbl = (UILabel*)[[headers objectAtIndex:0] viewWithTag:2]; todayWeather = [[UIImageView alloc] initWithFrame:CGRectMake(lbl.frame.size.width + lbl.frame.origin.x-5, 38, 30, 25)]; [[headers objectAtIndex:0] addSubview:todayWeather]; lbl = (UILabel*)[[headers objectAtIndex:1] viewWithTag:2]; tomorrowWeather = [[UIImageView alloc] initWithFrame:CGRectMake(lbl.frame.size.width + lbl.frame.origin.x-5, 38, 30, 25)]; [[headers objectAtIndex:1] addSubview:tomorrowWeather]; [self gotWeather]; } else{ NSMutableArray* labels = [[self getLabels] valueForKey:@"values"]; CGRect headerFrame, labelFrame, seperatorFrame; if ([defaults integerForKey:DISPLAY_TYPE]==DisplayTypeNotes) { headerFrame = CGRectMake(0, 0, 320, 60); labelFrame = CGRectMake(10, 30, 300, 30); seperatorFrame = CGRectMake(0, 59, 320, 1); }else{ headerFrame = CGRectMake(0, 0, 320, 68); labelFrame = CGRectMake(10, 38, 300, 30); seperatorFrame = CGRectMake(0, 67, 320, 1); } for(int i=0;i<[labels count];i++){ UIView* header = [[UIView alloc] initWithFrame:headerFrame]; header.backgroundColor = [UIColor whiteColor]; UILabel* lbl = [[UILabel alloc] initWithFrame:labelFrame]; lbl.tag = 2; lbl.font = XX_LARGE_VOLKS_FONT; [lbl setBackgroundColor:[UIColor clearColor]]; [lbl setTextColor:[UIColor darkGrayColor]]; [lbl setText:[labels objectAtIndex:i]]; [header addSubview:lbl]; UIImageView *img; img = [[UIImageView alloc] initWithFrame:seperatorFrame]; [img setBackgroundColor:[UIColor darkGrayColor]]; img.alpha = 0.5; img.tag = 3; [header addSubview:img]; [header bringSubviewToFront:lbl]; [headers addObject:header]; } //add aditonale header for unlabeled tasks\notes UIView* header = [[UIView alloc] initWithFrame:headerFrame]; header.backgroundColor = [UIColor whiteColor]; UILabel* lbl = [[UILabel alloc] initWithFrame:labelFrame]; lbl.tag = 2; lbl.font = XX_LARGE_VOLKS_FONT; [lbl setBackgroundColor:[UIColor clearColor]]; [lbl setTextColor:[UIColor darkGrayColor]]; [lbl setText:MyLocalizedString(@"Not Labeled", @"Not Labeled")]; [header addSubview:lbl]; UIImageView *img; img = [[UIImageView alloc] initWithFrame:seperatorFrame]; [img setBackgroundColor:[UIColor darkGrayColor]]; img.alpha = 0.5; img.tag = 3; [header addSubview:img]; [headers insertObject:header atIndex:0]; } } 
+1
source share

All Articles