使用异步请求时的 exc_bad_access
Posted
技术标签:
【中文标题】使用异步请求时的 exc_bad_access【英文标题】:exc_bad_access when using a async request 【发布时间】:2011-08-03 20:10:54 【问题描述】:我正在发出异步请求,但是当我尝试使用此代码对其进行解析时
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
[connection release];
NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
[responseData release];
NSDictionary *missionsDict = [responseString JSONValue];
/*NSArray *luckyNumbers = [json objectWithString:responseString error:&error];*/
NSLog(@"user Info array is: %@", missionsDict);
// NSDictionary *array = [luckyNumbers1 objectForKey:@"data"];
NSDictionary *missionsData;
missionsData = [missionsDict objectForKey:@"data"];
NSLog(@"missionsData is: %@", missionsData);
NSEnumerator *inner = [missionsData objectEnumerator];
UIScrollView *missionsScroll;
missionsScroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
missionsScroll.contentSize = CGSizeMake(320, 1005);
[self.view addSubview:missionsScroll];
id value;
int badgeY1;
int badgeY2;
int badgeY3;
badgeY1 = 121;
badgeY2 = 161;
badgeY3 = 150;
while((value = [inner nextObject]))
NSLog(@"progress is: %@", [value objectForKey:@"progress"]);
NSLog(@"user Info array is: %@", missionsDict);
NSLog(@"name is: %@",[value objectForKey:@"reward_definitions"]);
NSLog(@"missionsData is: %@", missionsData);
NSDictionary *moreData;
moreData = [value objectForKey:@"reward_definitions"];
NSEnumerator *inner = [moreData objectEnumerator];
id value2;
int badgeX;
badgeX = 10;
while((value2 = [inner nextObject]))
UIProgressView *progressView;
progressView = [[UIProgressView alloc] initWithFrame:CGRectMake(0, badgeY3, 372, 9)];
float progressValue;
progressValue = ([[[value objectForKey:@"progress"] objectForKey:@"earned"] floatValue] / [[[value objectForKey:@"progress"] objectForKey:@"possible"] floatValue]);
NSLog(@"progressValue is: %f", progressValue);
[progressView setProgress:progressValue];
[missionsScroll addSubview:progressView];
UILabel *missionName;
missionName = [[UILabel alloc] initWithFrame:CGRectMake(20, badgeY1, 280, 25)];
missionName.backgroundColor = [UIColor clearColor];
missionName.textColor = [UIColor whiteColor];
missionName.font = [UIFont fontWithName:@"Heiti TC" size:23.0];
missionName.text = [value objectForKey:@"name"];
[missionsScroll addSubview:missionName];
NSLog(@"badgeY2 is: %@", badgeY2);
badgesScroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0, badgeY2, 318, 70)];
badgesScroll.contentSize = CGSizeMake(320, 70);
[missionsScroll addSubview:badgesScroll];
NSLog(@"Image URL is: %@", [value2 objectForKey:@"image_url"]);
NSURL *url1 = [NSURL URLWithString: [NSString stringWithFormat:@"%@", [value2 objectForKey:@"image_url"]]];
NSData *urlData1 = [NSData dataWithContentsOfURL:url1];
UIImage *image1 = [UIImage imageWithData:urlData1];
UIImageView *badge = [[UIImageView alloc] initWithImage:image1];
[badge setFrame:CGRectMake(badgeX, -10, 70, 70)];
[badgesScroll addSubview:badge];
[badge release];
badgeCount = badgeCount+1;
badgeX = badgeX +80;
// NSLog(@"reward_definitions is: %@", [missionsData objectForKey:@"id"]);
// NSLog(@"Image URL is: %@", [[value objectForKey:@"reward_definitions"] objectForKey:@"image_url"]);
//if ( [array isKindOfClass:[NSDictionary class]] )
badgeY1 = badgeY1 +100;
badgeY2 = badgeY2 +100;
badgeY3 = badgeY3 +100;
missionCount = missionCount+1;
for (int b; badgeCount > 4; b = b+1)
[badgesScroll setContentSize:CGSizeMake(badgesScroll.contentSize.width+80, badgesScroll.contentSize.height)];
for (int a; missionCount > 4; a = a+1)
missionsScroll.contentSize = CGSizeMake(776, missionsScroll.contentSize.height+200);
由于NSLog(@"badgeY2 is: %@", badgeY2);
上的 EXC_BAD_ACCESS 而崩溃
【问题讨论】:
【参考方案1】:您的 badgeY2 包含一个整数值。要使用 NSLog 打印整数值,必须使用 %d 使用 NSLog 时要时刻牢记,它返回的值是什么样的!
NSLog(@"badgeY2 is: %d", badgeY2);
还有另一种解决方案让您知道
NSLog(@"%@", [NSNumber numberWithInt:badgeY2]);
这些是 NSLog 格式说明符:
%@ Object
%d, %i signed int
%u unsigned int
%f float/double
%x, %X hexadecimal int
%o octal int
%zu size_t
%p pointer
【讨论】:
很棒的答案。感谢您包含不同的格式说明符【参考方案2】:应该是
NSLog(@"badgeY2 is: %i", badgeY2);
badgeY2 是一个 int,所以你必须使用 %i 而不是 %@
【讨论】:
以上是关于使用异步请求时的 exc_bad_access的主要内容,如果未能解决你的问题,请参考以下文章
线程代替epll实现协程的原理(yield调用next时的函数使用其他线程进行处理,不影响主线程继续运行,next异步处理线程处理后使用send传回处理结果)