我在NSURLConnection委托方法connectionDidFinishLoading执行时遇到错误。有趣的是,它适用于模拟器,但它在物理设备上崩溃。更有趣的是,它仅在完成此操作序列时崩溃,
错误日志:
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0xa0000008
Crashed Thread: 0
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libobjc.A.dylib 0x321befbc 0x321bb000 + 16316
1 Tittle-Tattle 0x0002cf10 -[MapViewController connectionDidFinishLoading:] (MapViewController.m:108)
2 Foundation 0x3316bc32 0x330a5000 + 814130
3 Foundation 0x330c36e2 0x330a5000 + 124642
4 Foundation 0x330c36ac 0x330a5000 + 124588
5 Foundation 0x330c35ce 0x330a5000 + 124366
6 CFNetwork 0x35e7689e 0x35e67000 + 63646
7 CFNetwork 0x35e6b53e 0x35e67000 + 17726
8 CFNetwork 0x35e6b632 0x35e67000 + 17970
9 CFNetwork 0x35e6b23c 0x35e67000 + 16956
10 CFNetwork 0x35e6b172 0x35e67000 + 16754
11 CoreFoundation 0x34176afc 0x340e9000 + 580348
12 CoreFoundation 0x341762c8 0x340e9000 + 578248
13 CoreFoundation 0x3417506e 0x340e9000 + 573550
14 CoreFoundation 0x340f84d6 0x340e9000 + 62678
15 CoreFoundation 0x340f839e 0x340e9000 + 62366
16 GraphicsServices 0x3254dfc6 0x3254a000 + 16326
17 UIKit 0x3734e73c 0x3731d000 + 202556
18 Tittle-Tattle 0x000200e0 main (main.m:16)
19 Tittle-Tattle 0x00020084 start + 32
代码:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
[urlConnection cancel];
[urlConnection release];
NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
//Since we got new fresh data we shall put it in LatestLocationData entity in CoreData
[self insertLastKnownLocationDataIntoCoreDataWith:responseString];
//Test purpose only, See what we have got in CoreData
[self fetchLastKnownLocationDataFromCoreData];
NSDictionary *results = [responseString JSONValue];
placesNearBy = [results objectForKey:@"results"];
[responseString release];
[self dropNearByPlacesAnnotationsFrom:placesNearBy];
}
问题:可能的原因是什么?
类似问题(不是我!)之前曾问过,但没有人回答过这个问题:Application not running in iOS 5
到目前为止我的理解是,EXE_BAD_ACCESS仅在您尝试访问尚未分配的内存地址时发生,或者先前已分配,但现在已经发布。
评论后回复编辑:
嘿Firoze,这就是我的初始NSURLConnection
urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
答案 0 :(得分:3)
查看您的评论我建议您对所有ivars使用@property
声明。它们将减轻您必须执行的所有手动内存管理,这可能是您的问题所在。
快速示例
<强> YourClass.h 强>
@interface YourClass
@property (nonatomic, retain) NSURLConnection *urlConnection;
// More ivars
// Method declations
@end
<强> YourClass.m 强>
@interface YourClass
@synthesize urlConnection = _urlConnection;
// The method where you instantiate urlConnection
{
NSURLConnection *urlConnection = [[NSURLConnection alloc] initWithRequest:request
delegate:self];
self.urlConnection = urlConnection;
[urlConnection release]; urlConnection = nil;
// Do whatever else you do here
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
[self.urlConnection cancel];
self.urlConnection = nil; <- This takes care of releasing the ivar and setting it to nil so there is no dangerous hanging pointer
// ... the rest of your method
}
[urlConnection cancel];
[urlConnection release];
// You need to clean up after yourself with any ivars you make
- (void)dealloc
{
[_urlConnection release];
// Release any other ivars
[super dealloc];
}
@end