objective-c – 不保留财产(ARC)
发布时间:2020-12-16 07:32:04 所属栏目:百科 来源:网络整理
导读:我有一个模态视图控制器,以表单样式显示.它有一个委托协议.我正在实现该协议并在演示之前分配一个委托,但即使该属性很强,它也会丢失.欢迎任何可能的原因.谢谢! 这是财产声明,强大. @protocol SDStoreViewDelegate NSObject// Methods@end@interface SDStore
我有一个模态视图控制器,以表单样式显示.它有一个委托协议.我正在实现该协议并在演示之前分配一个委托,但即使该属性很强,它也会丢失.欢迎任何可能的原因.谢谢!
这是财产声明,强大. @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]; 如果答案是肯定的,那么你没有丢失你的代表,如果答案是否定的,你在哪里设置代表? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |