8

私は知っています、デリゲートは決して保持されません! これまで!

しかし、誰でもデリゲートが保持されない理由を説明できますか?...

事前にサンクス

4

4 に答える 4

14

それはメモリ管理のことです。

Objective-Cは参照カウントと連携して、メモリをクリーンに保ちます。これは、循環関係を検出できないことを意味します。

例:

  • オブジェクトAはオブジェクトBを所有しています。オブジェクトBはオブジェクトAによって保持されます。
  • オブジェクトBには、オブジェクトAであるデリゲートがあります。オブジェクトAはオブジェクトBによって保持されます。
  • オブジェクトCはオブジェクトAを所有します。オブジェクトAはオブジェクトCによって保持されます。
  • オブジェクトAのretainCountは2になり、オブジェクトBのretainCountは1になります。
  • オブジェクトCが解放され、オブジェクトAが解放されます
  • オブジェクトAとBは、お互いを所有しているため、retainCountが1になりました。保持カウントはまだ1(別のオブジェクトによって所有されている)であるため、システムはそれらを解放しません
  • メモリーリーク!
于 2012-12-20T12:33:58.370 に答える
4

それはあなた次第です。保持することを宣言した場合(strongARCで)、保持されます。

ルールは、他の場所で既に保持されているため、保持しないことです。さらに重要なのは、保持サイクルを回避することです。

于 2012-12-20T12:32:30.907 に答える
2

To expand on djromero's answer:

If you have a UIViewController which contains a UITableView, the controller will be most likely retaining the table and it will be it's delegate / dataSource. If the table retains the delegate / dataSource, then they will be retaining each other and thus never getting released.

于 2012-12-20T12:34:56.273 に答える
1

全体的な考え方は、デリゲートは、デリゲートとして割り当てるオブジェクトよりも常に長持ちする必要があるということです。したがって、Webビューは、割り当てられた代理人の前に解放されます。

于 2012-12-20T12:33:37.393 に答える