委托的自定义setter方法被称为无限次

时间:2016-06-03 13:11:55

标签: ios objective-c delegates

在我的VC中,我声明了一个自定义委托属性:

@interface VC2 : BaseVC
@property (nonatomic,weak) id<VC2Delegate> delegate;
@end

从VC1开始,我设置了这个代理:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if ([[segue identifier] isEqualToString: @"VC2"]) {
        self.VC2 = [segue destinationViewController];
        [self.VC2 setDelegate:self];
    }
  }

在我的VC2中,我为委托编写了一个setter方法:

-(void)setDelegate:(id)del{
    self.delegate=del;
}

问题,在VC1中的pprepareForSegue方法调用之后,VC2中委托的setter方法被调用了很多次,我的应用程序崩溃了。我不确定原因是什么。

这是satcktrace:

enter image description here

enter image description here

我没有任何实施我的BaseVC。它只是一个普通的VC。

3 个答案:

答案 0 :(得分:4)

当您使用self.delegate访问您的媒体资源时,您实际上正在调用此getter。尝试将其设置为实例变量:

-(void)setDelegate:(id)del{
    _delegate=del;
}

答案 1 :(得分:2)

这是你的问题 self.delegate实际上是一个制定者,这就是你骑自行车的原因。 你应该在你的setter中使用_delegate = del。

答案 2 :(得分:2)

您不需要setter方法,因为您可以直接设置委托,如

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if ([[segue identifier] isEqualToString: @"VC2"]) {
    self.VC2 = [segue destinationViewController];
    self.VC2.delegate = self;
}
 }

您只需要在VC2的.h文件中声明委托属性。

您可以在VC2.h中获取属性,

   @property ViewController *delagate;

Viewconroller是您从VC调用prepareForSegue并设置委托

的VC