0

タブの切り替えに関する特定のイベントを処理するUITabBarControllerだけでなく、サブクラス化も行っています。UITabBarControllerDelegate

カスタムタブバーコントローラーには、次のものがあります。

- (id)initCustomTabBarController {
    self = [super init];
    if(self) {
       [self setDelegate:[[CustomTabBarControllerDelegate alloc] init]];
       // ...
    }
    return self;
}

プロジェクトを ARC に移行したため、デリゲートが早期にリリースされ、割り当てが解除されたインスタンスにタブ スイッチが実行されます。

プロパティはassignin UITabBarController.h- のように定義されていますが、これには明らかに影響はありません。

デリゲート オブジェクトを init メソッドよりも長く "有効" にするにはどうすればよいですか?

4

2 に答える 2

2

はい、これは ARC では正常です。ARC への参照が行われていないため (強力なプロパティとしても知られています)、サイクルの終わりにリリースする必要があります。

テイクを割り当てるクラスでプロパティを作成するだけで、CustomTabBarControllerDelegate強力になります。次に、このプロパティをデリゲートに割り当てます。

ARC 以外で設定した方法では、メモリ リークが発生する可能性があります。

于 2012-12-12T12:31:36.240 に答える
2

あなたが行った方法では、デリゲートは弱いため、オブジェクトよりも長生きしないことが期待されます。オブジェクトを作成したのはあなたであることを忘れないでください。それを保持するのはあなた次第です。

ただし、使用しているパターンは正しくありません。

デリゲートのポイントは、十分な情報がないため、クラスがそれ自体に追加できないメソッドの実装をクラスに提供することです。たとえば、テーブル ビュー デリゲートです。テーブルビューは、一般的なものにするために、表示する行またはセクションの数を知ることができないため、この情報を提供するようデリゲートに依頼します。

あなたの場合、独自のデリゲートを作成しているオブジェクトがあります。その場合、わざわざデリゲートを用意する必要はありません。クラスにメソッドを実装するだけです。

于 2012-12-12T12:37:01.200 に答える