Objective c委托自我释放

Posted

技术标签:

【中文标题】Objective c委托自我释放【英文标题】:Objective c delegate self release 【发布时间】:2012-08-05 08:48:25 【问题描述】:

假设我有某种静态类,我的意思是我的静态库的 .h 类,其中包含所有静态函数。一些函数对 Web 服务进行异步请求,并将 NSMutableURLRequest 与 initWithRequest:request 一起使用。因为我想监视来自服务器的数据,所以我创建了一个实现所有 NSURLConnectionDelegate 连接协议的委托,即接受、附加、完成并将其传递给请求。

问题是,由于我的 .h 类中有所有静态方法,并且我没有 NSURLConnectionDelegate 委托作为成员(因为类是静态的),我在哪里释放我的连接委托?主要问题是在 connectionDidFinishLoading 委托方法中对 NSURLConnectionDelegate 进行自我释放是一种常见的做法吗?

谢谢

【问题讨论】:

【参考方案1】:

您可以在将委托分配给 NSURLConnection 后立即释放它。来自the documentation:

在下载期间,连接保持对委托的强引用。当连接完成加载、失败或被取消时,它会释放该强引用。

这是对象仅持有对其委托的弱引用的一般规则的一个例外。

【讨论】:

【参考方案2】:

释放委托不是正常的做法,因为对象保留委托是不正常的。委托通常使用weak (__unsafe_unretained) 属性进行引用,因此在释放对象时可以安全地中断引用。

【讨论】:

我在静态“+”方法中发送异步请求,并在那里创建 NSURLConnectionDelegate 以传递给 NSMutableURLRequest,因此当连接完成加载数据时,我无法从自身外部释放此委托。因此,ro 释放委托的唯一可能性是在其内部。那我该如何处理呢? 所以你使用类工厂方法,那又怎样。在该方法之外创建持久委托,并在方法的参数中传递委托引用,如下所示:[MyClass sendRequest:myRequest withDelegate:myDelegate]。您的委托应符合NSURLConnectionDelegate 协议。 谢谢,我是怎么做到的,但是由于我使用 .h 外部 API 创建了一个静态库,我不想将委托内部结构暴露给客户端,只有客户端通过 .h 调用的静态函数API。有什么建议吗? 然后在您的库 (MyURLConnectionDelegate) 中为您的委托创建新类,并使您的请求方法只接受该类的委托。在您的情况下,委托应该是外部的,内部委托将在您的方法完成后立即释放,否则您将获得僵尸。 好的,谢谢,但是我如何防止客户端不覆盖 NSURLConnectionDelegate 方法?如果客户端从外部设置委托?

以上是关于Objective c委托自我释放的主要内容,如果未能解决你的问题,请参考以下文章

创建一个对象作为委托 - Objective C

主应用程序窗口的 Objective C 委托

扩展现有协议以修改 Objective C 中的委托参数

在 Swift 项目中使用 Objective C 类中的 Swift 类

在 Swift 项目中使用 Objective C 类中的 Swift 类

Objective C - 共享*几乎*相同的委托方法的类