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
が解放され、delegate
foravcInstance
は無効になります。
classBInstance
理想的には、 (ClassB の自己) の所有権をavcInstance
;に結び付けたいと思います。がavcInstance
解放されると、classBInstance
またはデリゲートが解放されます。
または、リリース前に呼び出されるclassBInstance
-でクリーンアップすることもできます。cleanupCalledByDelegate
avcInstance
これをどのように処理するのが最善ですか?ClassA のプロパティを作成したくないClassB *classBInstance
のは、それを release にする必要があり、それclassBInstance
を ClassB で処理したいからです。これが最善の解決策である場合、ブロックを使用し、ClassA で完了ブロックを渡します。
{
classBInstance = nil;
}
に-goWithOptions
、私はそれを呼び出します-cleanupCalledByDelegate
。これはこれを処理する正しい方法ですか?