将ViewController传递给子视图,然后再次返回,无法释放iOS中的VC

我有一个问题(与这个问题有关)。 但是根本问题与我原先想象的不同,我需要把它作为一个新的问题来发布。 但是我会更新上一个问题来引用这个问题 – 如果有人能够提供帮助的话。

我有一个UINavigationController ,它具有作为rootViewControllervcB然后被推到导航堆栈上。 vcB有一个子视图,它是一个UIView子类(称之为BSView ),上面有一些button。 我需要让vcB知道什么时候点击BSView上的button,所以我实现了一个@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初始化方法如下所示:

 - (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]; } 

似乎工作正常。 所有的方法都按预期调用。 这是问题。 当我popupvcB回到vcA,vcB永远不会被释放。 如果再次按下vcB,则内存只是循环。 我可以重复这个循环,直到应用程序爆炸。

当我不使用任何委托variables(或nil值)初始化BBView时, vcB内存将在导航popup窗口上释放。 但是,当然, vcB永远不会意识到button点击。

有没有人有任何想法可能会发生什么? 我已经搞了很长一段时间了,我简直无法弄清楚如何将vcB作为对象传递给BBView并在导航popup到vcA时释放它。

任何指针将是最有帮助的。

您的delegate指针正在创build一个保留循环。 您应该将delegatevariables声明为__weak或作为weak属性