問題タブ [objective-c-runtime]
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.
iphone - objc_setAssociatedObject()とは何ですか?どのような場合に使用する必要がありますか?
私が引き受けたプロジェクトでは、元の作者が使用することを選択しましたがobjc_setAssociatedObject()
、それが何をするのか、なぜ彼らがそれを使用することにしたのか、100%明確ではありません。
私はそれを調べることにしましたが、残念ながら、ドキュメントはその目的についてあまり説明していません。
objc_setAssociatedObject
指定されたキーと関連付けポリシーを使用して、指定されたオブジェクトに関連付けられた値を設定します。
void objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy)
パラメータ
object
関連付けのソースオブジェクト。
key
協会の鍵。
value
オブジェクトのキーキーに関連付ける値。nilを渡して、既存の関連付けをクリアします。
policy
協会の方針。可能な値については、「関連オブジェクトの動作」を参照してください。
では、この関数は正確に何をし、どのような場合に使用する必要がありますか?
回答を読んだ後に編集する
では、次のコードのポイントは何ですか?
デバイスがすでにインスタンス変数である場合、デバイスをView Controllerに関連付けることのポイントは何ですか?
objective-c - Objective-C の class_addMethod は特定のインスタンスでのみ機能しますか?
ユーザーがクラスの特定のインスタンスからメソッドを呼び出して実行時に解決できる動的コードを作成しようとしています。情報を取得するための実装は存在しますが、インスタンスごとであるため、情報にアクセスするためのメソッドはありません。
たとえば、ユーザーは、クラスに存在しない「getSomething」という名前のメソッドを呼び出したい場合があります。
この状況では、作業中のインスタンスにのみ適用される変数の戻り値の型を持つ実装を解決したいと考えています。Objective-C のclass_addMethodを使用することを検討していましたが、その動作について 100% 確信が持てません。ドキュメントでは、これを使用してクラスまたはインスタンスメソッドを追加できると主張しています。このクラスを呼び出すと、特定のインスタンスのみにメソッドが追加されますか?それとも、後で作成されるすべてのインスタンスにメソッドが追加されるように、クラスにメソッドが追加されますか? また、メソッドが追加されると削除できないことも読みました。
おそらく私のアプローチは正しくないので、代替案があれば教えていただければ幸いです。すでに実装されているセレクターを理解するクラスがないため、メッセージ転送を使用できません。
objective-c - ID 以外のポインタを objc_SetAssociatedObject の値として使用しても問題ありませんか?
タイトルの通りです。これを行っても、すぐに問題はありません。
それを使用することに注意する正当な理由はありますか?
iphone - +(void)ロードメッセージがデバイスランタイムでフレームワーククラスに送信されない
私はここで質問を調べて、なぜこの動作が見られるのかについてのヒントを探しましたが、まだ何もありません。
静的ライブラリに組み込まれ、フレームワークバンドルにラップされたクラス(実際には同じ問題を示す2つのクラス)について考えてみます(使用する手順)。それらは、Foundationフレームワーククラスクラスター(NSMutableDictionary
およびNSMutableArray
)から継承します。
これらのクラスの使用は、静的関数(クラスメソッドではありません!)を使用してインスタンス(ファクトリヘルパー関数の一種ですか?)を割り当てて初期化する前に、いくつかの静的変数が初期化されることに依存しています。
iOSアプリプロジェクトがそのフレームワークにリンクしている場合、シミュレーターとデバイスの間でObjective-Cランタイムクラスの読み込み動作に違いがあります。
具体的には、デバイス(iPhone 4、iOS 4.3.3)では、アプリがロードされたときにこれらのクラスは+load
メッセージを受け取らず、静的変数は初期化されないため、静的ファクトリメソッドは失敗します。シミュレーターでは、メッセージが送信され、すべてが意図したとおりに機能します。デバイスランタイムに問題がある可能性があります
私の質問は、+load
メッセージが確実に送信されるようにフレームワークを別の方法で構成できるかどうかです。または、iOSでの静的ライブラリ/フレームワーククラスの読み込みに関するバグに遭遇しましたか?
クラスはJSONKitライブラリ(JKArray
、JKDictionary
)からのものです。
この問題を説明するプロジェクトの例はここにあります– https://github.com/ohhorob/JSONKit-in-framework-demo
編集:@bbumの提案に従って、アプリケーションの実行中にクラスJKDictionary
とJKArray
クラスが実際に読み込まれ、使用可能であることを確認しました。DeviceBroken
GitHubプロジェクトのブランチは、使用された検証で更新されます。
Appleにバグレポート(#9461567)を提出しました。
objective-c - メソッドを呼び出したオブジェクトを取得する
次のようなランダムなクラス内から呼び出しがある場合:
内部SomeSingleton sharedInstance
で、このメソッドを呼び出したオブジェクトへの参照を取得する方法はありますか (もちろん、呼び出された自己をパラメーターとして渡すことなく)。
objective-c - objc_disposeClassPair()の使用
ランタイムAPIには、文書化されていない関数があります。これは、(いくつかのおもちゃのプログラムに基づいて)その名前が示すとおりに実行するように見えます。
ただし、詳細な情報は地上ではかなり薄いです。したがって、これは単一の質問というよりも、関連する質問の集まりです。
- それを見る良い記事/ブログ投稿はありますか、または誰かがそれを使用した経験がありますか(簡単なグーグルはPyObjC開発者が少なくともある時点でそれを使用することを検討したことを示唆しています)?
- 破棄されたクラスは完全に割り当て解除されています(クラスを頻繁に作成および削除するアプリケーションはメモリをリークしますか?)
- 文書化されていないAPIについて、通常以外に覚えておく価値のある落とし穴はありますか?
- Appleはどこで使用していますか(/使用される可能性があります)?NSBundleのアンロード?KVO?
objective-c - 認識されないセレクターをオブジェクトに送信しています。アプリケーションを終了するのはなぜですか?
Objective-C を研究するとき、その高度なダイナミズムの結果の 1 つは、実行時にオブジェクトが応答しなくても、オブジェクトに任意のメッセージを送信できることです。
その後、メッセージを無視して例外を発生させます。
実際のケースでは、デリゲートに実装されていないデリゲート オブジェクトにメッセージを送信しようとしています。
もちろん、機能を実装するには実装する必要がありますが、純粋に興味がないので、そうしないとアプリケーションがクラッシュするのはなぜだろうと思っていました。
objective-c - クラスのメソッドを列挙する方法
1つのクラスのメソッドを列挙する方法はありますか?たとえば、次のように1つのクラスを定義しています。
そして、クラスに2つのメソッドがあることを知る前でも、enumerateメソッドを使用してメソッド「doStuff1」と「doStuff2」にアクセスできる方法があるかどうか疑問に思いました。
私は方法を知っています[foo performSelector:@selector(doSutff1)]
が、これは私が望んでいないことです。
plsどんな男も私に道を教えてくれます、thxそんなに。
objective-c - Cocoa/Objective-Cプラグインの衝突
私のアプリケーションには、ユーザーが実行時にロードされる独自のプラグインを作成できるプラグインシステムがあります。通常、これは問題ありませんが、場合によっては、2つのプラグインが同じライブラリを使用するため、これら2つのプラグイン間で衝突が発生します。
例:
プラグインAはJSONを操作するためにTouchJSONを使用したいので、作成者はTouchJSONコードをプラグインソースに追加し、コンパイルされてプラグインバイナリにリンクされます。後でプラグインBも同じライブラリを使用したいと考えており、まったく同じことを行います。これで、アプリがこれら2つの異なるプラグインをロードすると、これが検出され、次のような警告が表示されます。
クラスCJSONScannerは、[path_to_plugin_a]と[path_to_plugin_b]の両方に実装されています。2つのうちの1つが使用されます。どちらが未定義です。
私のアプリはプラグインをロードするだけで、それらが特定のプロトコルに準拠していることを確認するため、ロードするプラグインと、2つ以上が同じライブラリを使用するかどうかを制御できません。
両方のプラグインがまったく同じバージョンのライブラリを使用している限り、これはおそらく機能しますが、1つのプラグインでAPIが変更されるとすぐに、多くの問題が発生します。
これについて私にできることはありますか?
objective-c - 英数字以外の文字をセレクタとして使用できますか?
次のコードは正常にコンパイルおよび実行されます ( に注意してくださいsel_registerName("+")
)。
「うん」以外に、これを行うことに注意する理由はありますか?