4

我有一个以表单样式显示的模式视图控制器。它有一个委托协议。我正在实现该协议并在演示之前分配一个委托,但即使该属性很强大,它也会丢失。欢迎任何可能的原因。谢谢!

这是属性声明,一样强。

@protocol SDStoreViewDelegate <NSObject>
// Methods
@end

@interface SDStoreViewController : UIViewController

@property (strong, nonatomic) id <SDStoreViewDelegate> delegate;

@end

这是创建对象和设置委托的地方。

SDStoreViewController *store = [[SDStoreViewController alloc] init];
[store setDelegate:self];

NSLog(@"1 %@",store.delegate); // Returns Object as expected

[self presentViewController:store animated:YES completion:^{
    NSLog(@"3 %@",store.delegate); // Returns Object as expected
}];

NSLog(@"4 %@",store.delegate); // Returns Object as expected

这是 SDStoreViewController 的 viewDidLoad。它已经失去了它的代表

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"3 %@",_delegate); //  Returns NULL
}

这是解雇只是因为委托被称为它不是NULL。

- (void)dismiss:(id)sender
{
    NSLog(@"5 %@",_delegate); // Returns NULL

    [self.delegate aMethod];
}

更新

我已经使用了weakstrong引用。我也使用了self.delegate_delegate来访问该属性。作为一点,aMethod回调没有通过,这促使这项侦探工作找到了它迷路的地方。

4

2 回答 2

2

首先,该delegate属性必须始终是 weakunsafe_unretained否则ARC不能解除分配具有彼此强指针的类。

@property (weak, nonatomic) id <SDStoreViewDelegate> delegate;

或者

@property (unsafe_unretained, nonatomic) id <SDStoreViewDelegate> delegate;

您为什么不尝试delegate通过 getter 到达该属性?像这样:

NSLog(@"4 %@",self.delegate);

代替

NSLog(@"4 %@",_delegate);

还有一个额外的问题:您的方法是否在该行中被调用?

[self.delegate aMethod];

如果答案是肯定的,你没有丢失你的delegate,如果答案是否定的,你在哪里设置你的delegate其他地方?

于 2012-08-27T19:26:08.503 回答
0

在实现文件中添加一个 set 和 get 方法。就在合成功能旁边。

@synthesize delegate = _delegate;
- (id)delegate{
    return _delegate; // Add a breakpoint here
}
- (void) setDelegate:(id) delegate {
    if (_delegate != delegate){
        _delegate = delegate; // Add a breakpoint here
    }
}

还要在方法中放置一个断点,initWithCoder:看看它是否正确进入那里。

于 2012-08-27T19:19:57.330 回答