我有一个模态视图控制器,以表单样式显示.它有一个委托协议.我正在实现该协议并在演示之前分配一个委托,但即使该属性很强,它也会丢失.欢迎任何可能的原因.谢谢!
这是财产声明,强大.
@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];
}
更新
我使用了弱引用和强引用.我还使用了self.delegate和_delegate来访问该属性.而作为一个观点,aMethod回调没有通过,这是促使这个侦探工作找到它丢失的地方.
最佳答案 首先,委托属性必须始终是弱的或不安全的,否则ARC不能释放具有相互强指针的类.
@property (weak, nonatomic) id <SDStoreViewDelegate> delegate;
要么
@property (unsafe_unretained, nonatomic) id <SDStoreViewDelegate> delegate;
为什么你没有试图通过吸气剂到达代表财产?像这样:
NSLog(@"4 %@",self.delegate);
代替
NSLog(@"4 %@",_delegate);
还有一个额外的问题:你的方法在那条线上被召回了吗?
[self.delegate aMethod];
如果答案是肯定的,那么你没有丢失你的代表,如果答案是否定的,你在哪里设置代表?