3つのクラスを想像してください。ClassA と ClassB は私のものです。3 番目のクラスは、コードを変更できない UIViewController です。
クラスA:
- (void) aMethod
{
ClassB *classBInstance = [[[ClassB alloc] init] goWithOptions:options];
}
ClassBInstanceの存続期間のみ保持されaMethodます。
クラス B では:
- (void) goWithOptions
{
AUIViewController *avcInstance = [[AUIViewController alloc] init];
avcInstance.delegate = self;
[viewController pushViewController:avcInstance animated: YES]; // this returns immediately, but we need self to be retained until the delegate is done with it
}
- (void) cleanupCalledByDelegate //
{
// cleanup
}
-goWithOptionsメソッドが呼び出されると、呼び出しavcInstance先によって保持されますが、に渡される self は保持されdelegateません。つまり、-goWithOptions返されて終了するとすぐaMethodにclassBInstanceが解放され、delegateforavcInstanceは無効になります。
classBInstance理想的には、 (ClassB の自己) の所有権をavcInstance;に結び付けたいと思います。がavcInstance解放されると、classBInstanceまたはデリゲートが解放されます。
または、リリース前に呼び出されるclassBInstance-でクリーンアップすることもできます。cleanupCalledByDelegateavcInstance
これをどのように処理するのが最善ですか?ClassA のプロパティを作成したくないClassB *classBInstanceのは、それを release にする必要があり、それclassBInstanceを ClassB で処理したいからです。これが最善の解決策である場合、ブロックを使用し、ClassA で完了ブロックを渡します。
{
classBInstance = nil;
}
に-goWithOptions、私はそれを呼び出します-cleanupCalledByDelegate。これはこれを処理する正しい方法ですか?