随机BAD_ACCESS和“无法识别的选择器”

时间:2011-01-28 20:03:35

标签: objective-c cocoa-touch ipad

嘿,我是Objective C的初学者,我的.NET和Java年代已经发挥了我的记忆管理技能,所以我很可能在这里遗漏了一些东西。

我正在构建一个iPad应用程序。主视图是一个SplitView,左侧是TableView,详细视图包含另一个TableView。后者用数据加载已被注释掉以试图解决我的问题。

该应用程序似乎工作正常(必须从.NET WS中获取数据并将其解析到表中),但在随机时间我收到BAD_ACCESS或“选择器未识别”错误。

选择器无法识别错误我来到这里:

-(void) connection:(NSURLConnection *) connection
didReceiveResponse:(NSURLResponse *) response {
    [webData setLength: 0];
}

这段代码我相信大多数人都知道,我从网上和书中发现的所有样本中得到了这些代码来发送网页请求。

打败我为什么它说它不能识别setLength选择器,webData被定义为

NSMutableData *webData;

有什么想法吗?

感谢。

4 个答案:

答案 0 :(得分:1)

很可能您没有正确创建NSMutableData。我希望你的代码看起来像

webData = [NSMutableData data];

这将为您提供一个自动释放的对象,但您将其存储在ivar中。在将其存储在ivar中时,您需要获取对象的所有权。在您的情况下,最简单的方法是跳过便捷方法并使用alloc / init:

webData = [[NSMutableData alloc] init];

有关详细信息,请阅读Memory Management Programming Guide

答案 1 :(得分:1)

deallocviewWillDisappear取消连接时,似乎很常见(不仅仅是初学者)错误。当您离开控制器时,应取消控制器创建的所有连接,定时器等,以防止它们在解除分配的控制器对象上调用委托方法或选择器。

答案 2 :(得分:1)

如果您没有使用

分配webData对象
NSMutableData* webData = [[NSMutableData alloc] initWithCapacity:2048];

NSMutableData* webData = [[NSMutableData data] retain];

然后webData对象很可能在您从NSURLConnection消息(可能connection:didReceiveData:)中分配到connection:didReceiveResponse:消息的一个上下文切换期间自动释放。

在范围更改期间,任何不alloc或显式retain的对象都可能会被释放,即使它是您班级的成员变量。

答案 3 :(得分:0)

看起来webData正在被释放并被其他一些对象取代。如果你不使用alloc / init或mutableCopy来获取它,请确保保留它。