問題があります(このSOの質問に関連しています)。しかし、根本的な問題は当初考えていたものとは大きく異なるため、新しい質問として投稿する必要があります。しかし、これを参照するために前の質問を更新します - 誰かが助けてくれるなら。
私はUINavigationController
を持っvcA
ていrootViewController
ます。vcB
その後、ナビゲーション スタックにプッシュされます。いくつかのボタンを備えたサブクラス ( と呼びます) でvcB
ある子ビューがあります。ボタンがいつタップされたかを認識する必要があるため、以下に示すように asを実装しました。UIView
BSView
vcB
BSView
@protocol
BBView.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.m
init メソッドは次のようになります。
- (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
。
どんなポインタでも最も役に立ちます。