使用外部类的 ASIHTTPRequest

Posted

技术标签:

【中文标题】使用外部类的 ASIHTTPRequest【英文标题】:Using ASIHTTPRequest from external class 【发布时间】:2011-01-28 07:48:42 【问题描述】:

这是另一个新手问题。

我想从外部类调用 ASIHTTPRequest(因为我已经在我的主类中使用了它)并且我做了这样的事情:

ASIHTTPNSFabExt *nRequest = [[ASIHTTPNSFabExt alloc]init];

nRequest.URL = @"http://something";
nRequest.var1 = [dictionaryRecord objectForKey:@"something"];
nRequest.var2 = [dictionaryRecord objectForKey:@"something"]; 
[nRequest saveComment]; 

saveComment 方法执行 ASIHTTPRequest 任务的地方。

一切正常,除非我尝试在我的主类中执行 [nRequest release],这将在 ASIHTTPRequest 方法中生成错误。

Retain Count before my release is 1 并且 autorelease 也不起作用:我确定我缺少一些内存管理基础知识,但您能帮我寻找正确的操作方法吗?

提前感谢

法布里齐奥

【问题讨论】:

【参考方案1】:

到目前为止,您发布的代码没有明显错误。问题可能在于您在 ASIHTTPNSFabExt 的 init/dealloc 方法中处理对 ASIHTTPRequest 对象的引用。

将 ASIHTTPRequest 包装在另一个 Objective-C 类中并没有什么特别之处 - 只是标准确保您在正确的位置保留/释放对象,而不是在释放后使用它。

我假设你是个聪明人,所以你几乎可以肯定自己使用调试 ios 内存问题的标准技术来解决这个问题。

首先,在启用 NSZombies 的情况下运行;检查控制台/应用程序停止的位置,您几乎肯定会发现一条错误消息“已发送到已释放对象的消息”,以及一个回溯,可以准确显示哪一行代码试图发送该消息。

然后你只需要弄清楚为什么那行代码会发送到一个被释放的对象。这可能是缺少“保留”或“释放”太早或没有将 nil 分配给持有该对象的实例变量。

-- 编辑--

另外值得一提的是,您应该确保在您的 dealloc 方法中从 ASIHTTPRequest 中删除委托,否则它可能会在您的类被释放后尝试调用它 - request.delegate = nil;[request clearDelegatesAndCancel];

【讨论】:

我不确定我是否完全理解您的回复,但我认为最后一部分是问题所在,因为我没有删除 ASIHTTPRequest 委托,而且我认为它正在调用他们创建 nRequest 已发布。我看不到代码的哪一部分生成了“解除分配的对象”,它是 ASIHTTPRequest 中的一种方法,但我无法理解。无论如何谢谢 为了结束这个话题,我想我已经使用 [nRequest retain] 然后 [nRequest release] 进行了修复。它似乎正在工作。谢谢

以上是关于使用外部类的 ASIHTTPRequest的主要内容,如果未能解决你的问题,请参考以下文章

使用外部类的 ASIHTTPRequest

内部类的使用

内部类的使用类型

使用外部类的模板参数设置内部模板类的默认模板参数

我如何使用外部类的类的Graphics对象

外部/局部/内部类的权限修饰符