0

我有一个委托 ExampleDelegate,我有一个 UITableViewController 和详细 UIViewController 都实现了该委托:

@interface ClassA : UITableViewController <ExampleDelegate>

和:

@interface ClassB : UIViewController <ExampleDelegate>

并委托:

@protocol ExampleDelegate <NSObject>

-(void)notifyUser;

@end

@interface Example : NSObject

@property (nonatomic, retain) id delegate;

-(id)initWithDelegate:(id<ExampleDelegate>) delegate;

@end

起初,我从 ClassA 初始化委托的实例并且它工作正常,但是一旦我导航到 ClassB,当我回到 ClassA 时,我也在为委托创建一个实例,委托实例从 ClassB 中保留,所以ClassB 中的函数总是被调用,而不是 ClassA 的函数。谁能指出我做错了什么以及如何让它发挥作用?

4

3 回答 3

1

您需要确保在不需要代表时将其取消 - 这将帮助您实现两件事:

  1. 向正确的类传递它在可见时需要处理的正确委托。
  2. 防止崩溃,以便当一个类被解除分配并被定义为委托时,您可能会收到“发送到解除分配实例的消息”崩溃。

在您的情况下,一旦 ClassB 回到 ClassA,您必须确保 ClassA 定义了该委托并且 ClassB 的委托属性为零。

于 2012-07-24T05:31:47.417 回答
0

您是否打算让 B 类成为 A 类的委托,以便它可以使用该-notifyUser方法进行回调?如果是这种情况,则不需要初始化程序,并且应该将类 B 上的委托属性声明为...

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

然后,如果我没听错的话,当您创建详细控制器(B 类)时,您会将其delegate属性设置为self(A 类)。现在,当 B 类需要与 A 类进行通信时,它只需要-notifyUser像这样调用它的委托...

// Something happened that you want to communicate back up the chain
[self.delegate notifyUser];

当您使用此模式时,协议通常在类上声明,该类也实现了要设置的属性,在本例中为 B 类。

于 2012-07-24T05:38:44.470 回答
0

编辑: 在这两个类中,我都将委托声明为strong变量,当我通过一些文档时需要声明它weak,因此通过更改它可以解决问题。

并感谢您提供的所有答案,这对您有很大帮助。

于 2012-07-24T08:37:44.370 回答