保留子类的委托可以吗ASIHTTPRequest
?
我做了一个子类ASIHTTPRequest
called JSONRequest
。每个实例JSONRequest
是它自己的委托,处理回调,并将它们传递给jsonDelegate
,这是一个私有财产JSONRequest
,并响应requestFinished:withResult:
,其中结果是NSDictionary
JSON 响应的表示形式。为此,我超载了setDelegate:
in JSONRequest
to do super.delegate = self; self.jsonDelegate = newDelegate
.
保留可以吗jsonDelegate
在这种情况下,因为经常jsonDelegate
是一个视图控制器,如果用户点击“后退”等,在加载请求时有时会释放它。我将释放jsonDelegate
in JSONRequest
调用回调方法后。
我怎么知道这没问题并且不会导致保留循环 https://stackoverflow.com/questions/918698/why-are-objective-c-delegates-usually-given-the-property-assign-instead-of-retain/918727#918727.
什么保留了请求? (也许是操作队列?谁知道呢?)
一般来说,您似乎提出的“即发即忘并给我回调”方法是一个坏主意。如果除了请求之外没有任何东西保留 VC,那么(除非您的应用程序结构有点愚蠢)VC 将永远不会对其接收到的数据执行任何操作,因此没有理由继续。
这也让人感觉不对:是请求拥有 VC,还是 VC 拥有请求?我希望是后者,所以 VC 也应该保留该请求。
有一些例外:
- CAAnimation.delegate 被保留,大概是因为动画将在某个时刻完成(我不确定如果它是重复动画会发生什么)。 UIKit 的动画委托也是如此
- NSTimer 保留了它的目标,可能是因为 NSInitation 保留了它的目标。 (我编写了一个“弱计时器”类来解决这个问题。)
- CADisplayLink 保留其目标,大概类似于 NSTimer。
对于这些情况,我经常使用不保留其目标的“弱代理”类来解决它(并且我围绕 NSTimer/CADisplayLink 编写了一个“弱计时器”包装器,以使这更容易一些。)
你是什么supposed要做的就是跟踪您发起的请求,并在 dealloc 中执行类似的操作
request.delegate = nil;
[request cancel];
self.request = nil;
同样,您应该在适当的时间取消注册通知/操作/KVO 回调。有一个例外:
- 如果您确定释放后它不会向您发送回调,则无需打扰,因此不需要清除文本字段委托和按钮操作/目标。
例外也有例外:
- UIWebView(至少在较旧的操作系统中)也被其他东西保留,可能与网络线程有关。如果 VC 在 Web 视图仍在加载时消失,它可能会崩溃。
- UIScrollView 滚动回调还会导致视图在 VC 的生命周期结束后保留。您可以通过例如测试这一点按住“完成”并在释放“完成”时开始轻弹。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)