可以保留ASIHTTPRequest委托吗?

ma1*_*w28 0 delegates objective-c retain asihttprequest assign

是否可以保留子类的委托ASIHTTPRequest

我做了一个ASIHTTPRequest被调用的子类JSONRequest.每个实例JSONRequest都是它自己的委托,处理回调,并将它们传递给它jsonDelegate,它是一个私有属性JSONRequest,并响应requestFinished:withResult:,其中result是NSDictionaryJSON响应的表示.要做到这一点,我重载setDelegate:JSONRequestsuper.delegate = self; self.jsonDelegate = newDelegate.

jsonDelegate在这种情况下保留是否可以,因为通常jsonDelegate是一个视图控制器,如果用户点击"返回"等,有时会在加载请求时解除分配.我将jsonDelegateJSONRequest调用回调方法后释放.

我怎么知道这没关系,也不会导致保留循环.

tc.*_*tc. 5

什么保留了请求?(操作队列,也许?谁知道?)

一般来说,你似乎提出的"一见不放,给我一个回调"的方法是一个坏主意.如果除了请求之外没有任何东西保留VC,那么(除非你的应用程序结构有点愚蠢)VC将永远不会对它收到的数据做任何事情,所以没有理由继续它.

它也有问题:请求是否拥有VC,或者VC是否拥有该请求?我期待后者,所以VC也应该保留请求.

有几个例外:

  • 保留CAAnimation.delegate,大概是因为动画将在某个时刻完成(我不确定如果它是重复动画会发生什么).UIKit的动画代表也是如此
  • NSTimer保留其目标,可能是因为NSInvocation确实如此.(我写了一个"弱定时器"类来解决这个问题.)
  • CADisplayLink保留其目标,可能与NSTimer类似.

对于这些情况,我经常使用"弱代理"类来解决它,它不保留其目标(我在NSTimer/CADisplayLink周围写了一个"弱定时器"包装器,以使这更容易.)

应该做的是跟踪你发起的请求和dealloc,做类似的事情

request.delegate = nil;
[request cancel];
self.request = nil;
Run Code Online (Sandbox Code Playgroud)

同样,您应该在适当的时间取消注册通知/操作/ KVO回调.有一个例外:

  • 如果您确定它在发布后不会向您发送回调,则无需费心,因此不需要清除文本字段委托和按钮操作/目标.

例外有例外:

  • UIWebView(至少在较旧的操作系统中)也被其他东西保留,可能与Web线程有关.如果在Web视图仍在加载时VC消失,它可能会崩溃.
  • UIScrollView滚动回调还会导致视图保留在VC的生命周期之外.您可以通过例如按住"完成"并在释放"完成"时开始轻弹来测试此项.