1

我有一个问题(与这个SO 问题有关)。但根本问题与我最初想象的不同,我需要将其作为一个新问题发布;但我会更新上一个问题以引用这个问题 - 如果有人能够提供帮助。

我有UINavigationController一个vcA作为rootViewController. vcB然后被推入导航堆栈。vcB有一个子视图,它是一个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.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

2

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

于 2013-08-22T17:53:41.113 回答