将ViewController传递给子视图,然后再次返回,无法释放iOS中的VC
我有一个问题(与这个问题有关)。 但是根本问题与我原先想象的不同,我需要把它作为一个新的问题来发布。 但是我会更新上一个问题来引用这个问题 – 如果有人能够提供帮助的话。
我有一个UINavigationController
,它具有作为rootViewController
。 vcB
然后被推到导航堆栈上。 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一个保留循环。 您应该将delegate
variables声明为__weak
或作为weak
属性