0

1つのデリゲートExampleDelegateがあり、1つの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に戻ったときにデリゲートのインスタンスも1つ作成しているため、デリゲートインスタンスはClassBから保持されます。 ClassB内の関数は、ClassAの関数の代わりに常に呼び出されます。誰かが私が間違っていることとこれを機能させる方法を指摘できますか?

4

3 に答える 3

1

デリゲートが不要になったら、必ずデリゲートを削除する必要があります。これにより、次の2つのことを達成できます。

  1. 表示されているときに処理する必要がある適切な委任を正しいクラスに渡します。
  2. クラッシュを防ぎ、クラスの割り当てが解除されてデリゲートとして定義されたときに、「割り当て解除されたインスタンスに送信されたメッセージ」がクラッシュする可能性があるようにします。

あなたの場合、ClassBがClassAに戻ったら、ClassAにそのデリゲートが定義されていること、およびClassBのデリゲートプロパティがnilであることを確認する必要があります。

于 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 に答える