0

我是 Objective-c 的新手。我编写了几行代码来异步访问 Web 服务,然后处理结果。您能否解释一下当异步方法将委托(协议)作为参数时 ARC 是如何工作的?

例如,我通过NSURLConnection在方法中使用本地来调用 Web 服务:

-(void) invokeSomeWebServiceMethod {
   MyDelegate *const theDelegate = ...;
   NSURL *const url = ...;
   NSURLRequest *const request = ...;
   [NSURLConnection connectionWithReuqest: request delegate:theDelegate]; 
}

我不确定这种方法是否有效,因为NSURLConnection作为消息返回的隐式connectionWithRequest应该被标记为清理,因为调用方法和委托都没有对它的引用。但它有效!

所以:

  1. 运行时如何知道不会过早地清除 NSURLConnection正在工作的东西?
  2. 列表项 收到消息后,我是否应该释放/关闭委托中的连接 connectionDidFinishLoading
  3. 委托声明并作为消息的一部分invokeSomeWebServiceMethod传递是否更有意义?然后将创建的对象封装在委托中。selfconnectionWithRequestNSURLConnection

谢谢

4

1 回答 1

1
  1. 在下载连接时,它会保留自己。

  2. 如果您对连接有任何强引用,则应在完成连接对象后将它们设置为 nil。

  3. 要回答这个问题,我需要更多关于什么是MyDelegate真正的东西以及当前托管什么对象的信息invokeSomeWebServiceMethod

您可以通过在启用“记录引用计数”和禁用“仅跟踪活动分配”的分配工具下运行您的应用程序来查看保留和释放:

分配工具选项

然后,在 Instruments 下运行程序后,您可以在搜索栏中输入“NSURLConnection”,然后通过单击灰色圆圈中的白色小箭头来查看单个对象的跟踪:

一个 NSURLConnection 的仪器历史记录

-[NSURLConnectionInternal initWithInfo:]您可以在保留连接(第 1 行)的屏幕截图中看到(右键单击并在新选项卡中打开完整尺寸)。在连接完成发送其所有委托消息后,该保留由稍后的释放来平衡。

于 2012-12-11T03:50:20.987 回答