3

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返されて終了するとすぐaMethodclassBInstanceが解放され、delegateforavcInstanceは無効になります。

classBInstance理想的には、 (ClassB の自己) の所有権をavcInstance;に結び付けたいと思います。がavcInstance解放されると、classBInstanceまたはデリゲートが解放されます。

または、リリース前に呼び出されるclassBInstance-でクリーンアップすることもできます。cleanupCalledByDelegateavcInstance

これをどのように処理するのが最善ですか?ClassA のプロパティを作成したくないClassB *classBInstanceのは、それを release にする必要があり、それclassBInstanceを ClassB で処理したいからです。これが最善の解決策である場合、ブロックを使用し、ClassA で完了ブロックを渡します。

{
    classBInstance = nil;
}

-goWithOptions、私はそれを呼び出します-cleanupCalledByDelegate。これはこれを処理する正しい方法ですか?

4

1 に答える 1

5

単純に「classBInstance (ClassB の自己) の所有権を avcInstance に結び付けたい」場合は、objective-c オブジェクトの関連付けを使用できます。

#import <objc/runtime.h>

objc_setAssociatedObject( avcInstance, "my_association", classBInstance, OBJC_ASSOCIATION_RETAIN );

さらに、後で classBInstance にアクセスするための利便性がさらに必要な場合は、この関連付けコードを、classBInstance を avcInstance のプロパティとして公開するカテゴリ拡張にラップできます。

于 2013-08-06T21:01:10.937 に答える