問題タブ [nsinvocation]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
nsinvocation - NSInvocations を使用して完了ブロックを渡すにはどうすればよいですか?
サーバーに対して署名付きリクエストを行うアプリケーションがあります。すべての要求には認証トークンが必要です。リクエストを行うたびに、認証トークンが見つからなかった場合は、NSInvocation を使用してそのリクエストを保存し、認証トークンをクエリして呼び出しを呼び出し、完了ブロックを使用して元の呼び出しメソッドに戻ります。
私の質問は、return ブロックを NSInvocation に正しく渡すにはどうすればよいですか? エラーはありませんが、何らかの理由で [someClass listFilesWithCompletionBlock] の完了ブロックの元の呼び出し元がトリガーされません。
objective-c - Objective-C 引数値のインデックスベースのフェッチ
正しい引数値をNSInvocation
使用して、現在のメソッドの を動的に作成したいと考えています。通常、次のようにします。
引数の値を明示的に設定するのは簡単で、次のようなことができます。
次のようなループでこれを実行できるようにしたい:
難しい部分は、特定のインデックスの引数値を動的に取得することです。
同様の質問がここで尋ねられました。回答者は、クラスの複雑さを理由に解決策を認識していないと述べています。複雑さについては同意しません.コンパイラは使用されている呼び出し規約を認識しているため、スタックフレームが設定された後にスタックがどのように見えるかは、基礎となるコードで既に正確にわかっています. たとえば、x86 ではstdcall
、引数値が からの固定オフセットであることがわかっているため、引数値に簡単にアクセスできますebp
。
- 古い0
ebp
( %ebp) - リターンアドレス4(%ebp)
- 8(%ebp)の最初の引数
- 等
どうすれば欲しいものを達成できますか、または引数値のインデックスベースのフェッチをサポートするメカニズムが言語に実際に存在しませんか? C標準にはそのような機能が存在しないため、現時点ではこれを真と見なすことができます。ただし、この理由の確認および/または説明を求めたいと思います。
ios - 基本クラスなしでObjective-Cクラスを定義する-コンパイラの警告
Undo / Redoコードには、MattGallagherのNSInvocation
次のコードフォームを使用しています。最新バージョンのxCodeでは、次のような警告は表示されません。NSInvocation(ForwardedConstruction).m:28:12:基本クラスを指定せずに定義されたクラス'InvocationProxy'
コードはうまく機能しますが、私のチームの他のメンバー(私も)は警告を見るのが好きではありません。クラスをできるだけトリムしたいので、NSObjectのすべてのメソッドは必要ありませんでした。
どんな提案も歓迎します!
ありがとうございました!
NSInvocation(ForwardedConstruction).h
NSInvocation(ForwardedConstuction).m
objective-c - NSInvocation setArgument が単純な int32_t で機能しない
オブジェクトではない引数で NSInvocation を使用しているときに問題に直面しています。私が渡す単純な整数値は、別のものに変更されます。
これが私が呼び出しているメソッドです:
そして、これは私がそれを呼んでいる方法です:
結果は、ログに記録されるのは、私が渡す単純な 123456 値ではなく、次のようなものです。
** * ***180774176** * ** * ***
私が間違っているのは何ですか?
私はObjective Cにはかなり慣れていませんが、実行時に制御できないメソッドを呼び出す必要があります。また、引数の型として int64_t を取ります。
誰でも助けてください。ありがとう....
objective-c - forwardInvocation: はどのように呼び出されますか?
Objective-C ランタイム ライブラリだけを見ると、応答しないオブジェクトにメッセージが送信された場合、ランタイム システムは受信者にメッセージを処理する別の機会を与えます。したがって、レシーバーのforward::
メソッドが実装されている場合は、呼び出されます。ただし、NSObject.mmを見ると、NSObject
実装されていないようですforward::
。
では、転送が必要なときにランタイム システムが呼び出すのは だけなので、NSObject
のメソッドはどのように呼び出されるのでしょうか。Foundation は( runtime.h ) を使用して、オブジェクトに送信されたメッセージを転送する必要があるたびに呼び出す新しいハンドラーを設定しますか?forwardInvocation:
forward::
objc_setForwardHandler
forwardInvocation:
NSObject
ios - @selector の複数のパラメーター
Objective C でゲームを作成していますが、@selector で複数の変数を渡すことについて警告があります。私がやりたいことは、私の UIViewController でメソッドを呼び出すことですが、遅れてしまいます。だから私は、次のような遅延の後に他のメソッドを呼び出す最初のメソッドを作成しようとします:
しかし、それは機能していません。理由はわかりません。
ご協力いただきありがとうございます !
objective-c - -[NSInvocation preserveArguments] はブロックをコピーしますか?
NSInvocation
のメソッドは、をすぐに-retainArguments
実行せず、後で実行する場合に役立ちます。NSInvocation
オブジェクトの引数が保持されるため、この間も有効なままです。
ご存知のように、ブロック引数は保持するのではなく、コピーする必要があります。私の質問は、-retainArguments
ブロック型の場合、引数を保持する代わりにコピーすることを知っていますか? ドキュメントにはそうであるとは書かれていませんが、簡単で賢明なことのように思えます。
更新: iOS 7 で動作が変更されたようです。これをテストしたところ、iOS 6.1 以前で-retainArguments
は、ブロック タイプのパラメーターはコピーされませんでした。iOS 7 以降で-retainArguments
は、ブロック型のパラメーターをコピーします。のドキュメントは-retainArguments
更新され、ブロックをコピーすると書かれていますが、動作がいつ変更されたかは記載されていません (これは、古い OS をサポートしている人々にとっては非常に危険です)。
iphone - NSInvocation での予期しない例外
次のコードは例外をスローします。
vcClass
は Class
オブジェクトです ( からの継承者UIViewController
)。私の実装がSelf
含まれていますviewWillAppear:
メッセージ付き:
キャッチされていない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。理由: '-[NSInvocation setArgument:atIndex:]: インデックス (1) が範囲外 [-1, -1]
追加情報: iOS5、ARC。 誰かが私に何が悪いのか説明できますか?
更新しました:
このコードコードは、応答メッセージを表示します。私のクラスオブジェクトは正しい [vcClass instancesRespondToSelector:viewWillAppearSEL] ですか? NSLog(@"応答する") : NSLog(@"応答しない");
また、直後にクラッシュし[invocation setSelector:viewWillAppearSEL];
ます。そのため、トピック タイトルをUnexpected exception with NSInvocationと呼びました。
UPDATED2:
また、私の実装viewWillAppear: