0

独自のコンテキストでコアデータの変更を作成するモーダルビューコントローラーがあり、[完了]をクリックすると、変更が保存され(マージ変更通知がディスパッチされます)、デリゲートに通知して却下されます。

私の問題は、メインコンテキストが編集コンテキストの変更とマージされた後、デリゲートがメッセージを受信する必要があることです。次の実行ループでデリゲート呼び出しを実行したいのですが、オブジェクトの有効期間に問題があります。私は次のことを考えました:

  1. 電話をかけてください[delegate performSelector:withObject:afterDelay:]。ただし、そのメッセージは認識されていないようです。私のデリゲートはNSObjectプロトコルに準拠していますが、遅延のある実行セレクターは含まれていません。
  2. ビューコントローラでメソッドを作成しますinformDelegateWithObject:。デリゲートメソッドを呼び出し、遅延後にそのメソッドを呼び出します。つまり[self performSelector:@selector(informDelegateWithObject:) withObject:.. afterDelay:..]。これは機能する可能性がありますが、ビューコントローラが閉じられているため、遅延が数秒の場合、メモリから解放され、呼び出し時にクラッシュが発生することはありませんか?
  3. のインスタンスを作成しますNSInvocation。私はこれについて考えました、しかし、このオブジェクトの寿命は何ですか?を使用して作成した場合[NSInvocation invocationWithMethodSignature:]NSInvocationオブジェクトは自動解放されず、次の実行ループに使用されませんか?数秒は言うまでもありません。また、モーダルビューコントローラが閉じられて解放されているため、呼び出しオブジェクトをビューコントローラに保存できません。

助言がありますか?

4

4 に答える 4

1

コンテキストをデリゲートにマージする必要があります。

[保存]を押してモーダルコントローラーに入れるとしましょう。myViewController:didFinishSaving:をデリゲートに送信します。

myViewController:didFinishSaving:実装へのこのデリゲートは、モーダルビューコントローラーを保存、マージ、および閉じます。

私はあなたの問題を理解したと思います。さよなら!:)

于 2009-12-04T10:03:02.563 に答える
1

Booksmuccy が説明する線に沿って機能するApple の Core Dataチュートリアルを見ることができます。保存は、モーダル ビューが閉じられ、コントロールが親ビュー コントローラーに返された後に行われます。親には更新コードが含まれており、変更をマージするために必要な通知を発行します (それがデリゲートで発生するか、他の場所で発生するかに関係なく)。

于 2009-12-04T10:26:07.040 に答える
1

質問 #1: performSelector:withObject:afterDelay:NSObject プロトコルではなく、NSObject クラスで定義されています。使用しているオブジェクトは、おそらく NSObject のインスタンスです。おそらく、静的型チェックの結果としてのコンパイラの警告を参照しています。(技術的には、NSObject プロトコルに準拠するオブジェクトが NSObject ではない可能性があります。NSProxy はその一例です。ただし、通常使用するオブジェクトはすべて NSObject になります。) この警告は無視できます (Objective-C では、任意のメッセージを任意のオブジェクトに送信してみてください)。idまたは、必要に応じて、 (警告なしで任意のメッセージを送信できる) または のいずれかにキャストできますNSObject *

質問 #2:「遅延が数秒の場合、メモリから解放されたはずです」いいえ、ドキュメントにperformSelector:withObject:afterDelay:は、「このメソッドは、セレクターが実行されるまでレシーバーと anArgument パラメーターを保持する」と記載されています。

于 2011-08-01T00:50:30.193 に答える
0

次のようにデリゲートを宣言することもできます。

    NSObject <MyClassDelegateProtocol> *delegate;

次に、デリゲートもプロトコルに準拠する NSObject になります。

于 2010-11-15T12:41:02.230 に答える