2 ViewController通过协议进行通信

时间:2013-08-20 11:05:49

标签: objective-c uiviewcontroller protocols

从AppDelegate我通过协议与MyViewController通信。所以当在AppDelegate.m中调用此方法时:

- (void)thisMethodGetsCalled:(CustomData *)data {
     //Do stuff

     //Then call method via Protocol
     [_exampleDelegate exampleMethod:data];
}

它在MyViewController.m中调用此方法

- (void)thisMethodGetsCalledInsideViewController:(CustomData *)data {
     //Do stuff with data
}


//ExampleDelegate.h

#import <Foundation/Foundation.h>

@protocol SMMessageDelegate <NSObject>

- (void)thisMethodGetsCalledInsideViewController:(CustomData *)data;

@end

一切正常,正如预测的那样“thisMethodGetsCalledInsideViewController”在“thisMethodGetsCalled”之后被调用。假设MyViewController从未被实例化,那么“thisMethodGetsCalledInsideViewController”永远不会被调用。但是,MyViewController被实例化,后来被解雇:

[self dismissViewControllerAnimated:YES completion:nil];

我的应用程序在调用“thisMethodGetsCalled”时崩溃。它试图调用“thisMethodGetsCalledInsideViewController”,但该方法驻留在被解除的MyViewController中。有人知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

首先想到: 在某处您将MyViewController设置为符合协议的对象的委托? 你必须要么:

  1. 当MyViewController被解除时,将委托值设置为nil,或

  2. 将delegate属性设置为弱引用,即

  3. @property (nonatomic,assign) id<TheProtocol> delegate;

    希望有所帮助。