0

从 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 中,该方法已被解除。有人知道如何解决这个问题吗?

4

1 回答 1

1

首先想到:在某个地方您将 MyViewController 设置为它符合协议的对象的委托?您必须:

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

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

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

希望有帮助。

于 2013-08-20T11:34:19.020 回答