gpt4 book ai didi

objective-c - IOS8 - [UIlabel sizeToFit] 导致 EXC_BAD_ACCESS KERN_INVALID_ADDRESS 崩溃

转载 作者:太空狗 更新时间:2023-10-30 03:38:29 27 4
gpt4 key购买 nike

我们的用户在使用以下方法时经常遇到崩溃。崩溃总是发生在以下行之一:[lbl sizeToFit](lbl 变量被重新初始化和重用。据我所知,这不会导致任何问题).

这些崩溃只发生在 iOS8 上(相同的方法在 ios7 上使用了很长时间,没有任何问题)。我自己无法重现这次崩溃。目前,我唯一的线索来自“sizeToFit”苹果文档:

..In some cases, if a view does not have a superview, it may size itself to the screen bounds. Thus, if you want a given view to size itself to its parent view, you should add it to the parent view before calling this method.

但是,我不明白这会如何产生错误的内存引用。

-(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

最佳答案

我修改了一些您的代码并添加了注释。注意突出显示的部分。

-(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]; // take note of this part [lbl sizeToFit]; // always add view to its parent 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]; // take note of this part [lbl sizeToFit]; // always add view to its parent 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]; // take note of this part [lbl sizeToFit]; // always add view to its parent 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]; // take note of this part [lbl sizeToFit]; // always add view to its parent 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];

}
}

关于objective-c - IOS8 - [UIlabel sizeToFit] 导致 EXC_BAD_ACCESS KERN_INVALID_ADDRESS 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26461664/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com