在connectionDidFinishLoading,EXC_BAD_ACCESS中接收错误

时间:2011-11-13 01:17:45

标签: ios objective-c xcode ios5 exc-bad-access

我在NSURLConnection委托方法connectionDidFinishLoading执行时遇到错误。有趣的是,它适用于模拟器,但它在物理设备上崩溃。更有趣的是,它仅在完成此操作序列时崩溃,

  • 运行应用
  • 显示推文! (真棒)
  • 按主页按钮
  • 双击主页按钮
  • 强制退出应用
  • 再次打开应用
  • CRASHED !!!!! (:()...在重新启动手机之前不断崩溃!

错误日志

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];

1 个答案:

答案 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
相关问题