1

問題があります(このSOの質問に関連しています)。しかし、根本的な問題は当初考えていたものとは大きく異なるため、新しい質問として投稿する必要があります。しかし、これを参照するために前の質問を更新します - 誰かが助けてくれるなら。

私はUINavigationControllerを持っvcAていrootViewControllerます。vcBその後、ナビゲーション スタックにプッシュされます。いくつかのボタンを備えたサブクラス ( と呼びます) でvcBある子ビューがあります。ボタンがいつタップされたかを認識する必要があるため、以下に示すように asを実装しました。UIViewBSViewvcBBSView@protocolBBView.h

@protocol BBViewDelegate <NSObject>
@optional
-(void)buttonAPressed;
-(void)buttonBPressed;
-(void)buttonCPressed;
@end

@interface BBView : UIView {
    id<BBViewDelegate> _delegate;
    NSString *_title;
}
- (id)initWithFrame:(CGRect)frame withTitle:(NSString *)title 
        andDelegate:(id<BBViewDelegate>)delegate;
@end

BBView.minit メソッドは次のようになります。

- (id)initWithFrame:(CGRect)frame withTitle:(NSString *)title 
                                andDelegate:(id<BBViewDelegate>)delegate
{
    self = [super initWithFrame:frame];
    if (self) {

        _delegate = delegate;
        _title = title;
    }
  return self;
}

どこdelegateになりますvcB。がbuttonA押されると、次のコードが実行されます。

if(_delegate && [_delegate respondsToSelector:@selector(buttonAPressed)]) {
    [_delegate buttonAPressed];
}

これうまくいくようです。すべてのメソッドが期待どおりに呼び出されます。これが問題です。vcB を vcA に戻しても、vcB は解放されません。vcB が再度プッシュされると、メモリはサイクルアップします。アプリが爆発するまで、このサイクルを繰り返すことができます。

BBViewデリゲート変数 (またはnil値) で初期化しないとvcB、ナビゲーション ポップでメモリが解放されます。しかし、もちろん、vcBボタンのタップは認識されません。

何が起こっているのか誰にも分かりませんか?私は長い間これをいじっていましたがvcB、オブジェクトとして渡してBBView、ナビゲーションがポップバックされたときに解放する方法がわかりませんvcA

どんなポインタでも最も役に立ちます。

4

1 に答える 1