【问题标题】:Receiving errors in connectionDidFinishLoading, EXC_BAD_ACCESS在 connectionDidFinishLoading、EXC_BAD_ACCESS 中接收错误
【发布时间】:2011-11-13 01:17:44
【问题描述】:

在执行 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];

【问题讨论】:

  • @FirozeLafeer 嘿,伙计!我添加了 init 方法。有问题:) 谢谢。我在那里释放 NSString 因为我是 alloc 并且 init 是相同的函数。我想我应该释放它是吗?否则会泄漏
  • responseData 来自哪里?是否在创建它的地方保留它?
  • @Brogrammer 无视我对 responseString 的评论。没关系,我没有直接在那里思考。我错过了那部分。
  • @coneybeare 是的,当我创建 responseData 时,我有这样的代码: responseData = [[NSMutableData data] retain];我希望这是正确的创建方式:(
  • 代码中的第 108 行是哪一行(发生错误访问的地方)?

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


【解决方案1】:

查看您的 cmets,我建议您对所有 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

【讨论】:

  • 我刚刚检查了我的 dealloc 和 viewDidUnload 的另一件事从未收到过消息?这不寻常吗?似乎我在 dealloc 中的所有释放方法都是浪费:(
猜你喜欢
  • 1970-01-01
  • 2013-09-04
  • 1970-01-01
  • 2014-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-06
相关资源
最近更新 更多