我有一个以表单样式显示的模式视图控制器。它有一个委托协议。我正在实现该协议,并在演示前分配一个委托,但即使属性很强,它也会丢失。欢迎任何可能的原因。谢谢
这是属性声明,同样强大。
@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];
}
更新
我同时使用了weak
和strong
参考文献。我还使用了self.delegate
和_delegate
来访问该属性。作为一点,aMethod
回调没有通过,这就是促使这项侦探工作找到它丢失的地方的原因。
首先,delegate
属性必须始终为weak
或unsafe_unretained
,否则ARC
无法解除锁定具有强指针的类。
@property (weak, nonatomic) id <SDStoreViewDelegate> delegate;
或
@property (unsafe_unretained, nonatomic) id <SDStoreViewDelegate> delegate;
为什么您没有尝试通过getter访问delegate
属性?像这样:
NSLog(@"4 %@",self.delegate);
而不是
NSLog(@"4 %@",_delegate);
还有一个额外的问题:你的方法在那一行被调用了吗?
[self.delegate aMethod];
如果答案是肯定的,则表示您没有丢失delegate
;如果答案是否定的,则您在其他地方将delegate
设置在哪里?
向实现文件中添加一个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:
方法中放置一个断点,看看它是否能正确进入。