嘿,我是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;
有什么想法吗?
感谢。
答案 0 :(得分:1)
很可能您没有正确创建NSMutableData。我希望你的代码看起来像
webData = [NSMutableData data];
这将为您提供一个自动释放的对象,但您将其存储在ivar中。在将其存储在ivar中时,您需要获取对象的所有权。在您的情况下,最简单的方法是跳过便捷方法并使用alloc / init:
webData = [[NSMutableData alloc] init];
有关详细信息,请阅读Memory Management Programming Guide。
答案 1 :(得分:1)
在dealloc
或viewWillDisappear
取消连接时,似乎很常见(不仅仅是初学者)错误。当您离开控制器时,应取消控制器创建的所有连接,定时器等,以防止它们在解除分配的控制器对象上调用委托方法或选择器。
答案 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来获取它,请确保保留它。