問題タブ [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.

0 投票する
3 に答える
4942 参照

objective-c - 最新の Objective C ランタイムにおける ivar 合成の基本的なメカニズムは何ですか?

最新 (64 ビット OS X および iPhone OS) の Objective C ランタイムの機能の 1 つは、クラスで明示的に宣言せずに ivar を動的に合成するプロパティの機能です。

私のコードのかなりの部分で、プロパティを初期化するためにカスタム getter 実装を使用しています。

上記は、ヘッダーで宣言されていないivarにアクセスする必要があるため、合成されたivarと互換性がありません。さまざまな理由から、最新のランタイムでビルドするときに合成 ivar を使用するように多くの個人的なフレームワークを更新したいと考えています。その目標を達成するには、合成 ivar で動作するように上記のコードを変更する必要があります。

Objective C 2.0 のドキュメントには、最新のランタイムで合成されたアクセサーが最初の使用時に ivar を合成すると記載されています。これを行うために使用される低レベルのメカニズムは指定されていません。それは class_getInstanceVariable() によって行われますか、class_addIvar() の制限は緩和されますか、それは目的の C 2.0 ランタイムで文書化されていない関数ですか? プロパティをサポートするデータ用に独自のサイド ストレージを実装することもできますが、合成されたアクセサーが使用しているメカニズムを使用したいと思います。

0 投票する
3 に答える
1375 参照

c - C ベースの言語を GCC に追加するにはどうすればよいですか

独自の拡張機能を C に変更または追加し、それらを GCC C コンパイラに追加したい場合、何をする必要がありますか? 言語の変更を提案したくはありません。C コンパイラが実際にどのように機能するかを知りたいのです。

私はGCCのソースコードを見てきました.Objective-Cは、変更されたランタイムライブラリを参照するコードを生成する単純なパーサーとして実装されているように見えます.Cベースのすべてのものに対して、通常のC コンパイラ。私はそれを熱心に研究していないので、おそらく正しい軌道に乗っていません。

たとえば、自分のキーワードを Objective-C に追加したいとします。多分のように、実装しやすいと思われるものを追加したいと思い@assertます。私が望むのは@assert、Objective-C ランタイムに追加する関数を呼び出すことだけです。

明らかに、これを関数呼び出しとマクロとして実装することもできますが、C ソース コードの解析とコンパイルの段階を理解したいので、言語に独自の拡張機能を追加して、自分で使用できるようにしたいと考えています。

私が一貫して見てきたソース コードは「ツリー」を参照しており、アクションを実行したり、これらのツリーから情報を取得したりするマクロは非常に多くあります。

この種のことを詳細に説明しているドキュメントはありますか?

0 投票する
2 に答える
5878 参照

cocoa-touch - [[[UIApplicationsharedApplication]デリゲート]myClassプロパティ]を使用する場合のコンパイラ警告「プロトコルに見つかりません」?

appDelegateによってmyClassがインスタンス化され、myClassによってnewClassがインスタンス化された別のクラスがあります。newClassインスタンスから、それを作成したmyClassインスタンスのプロパティにアクセスしたいと思います。私はこれを次のように行いました:

これは機能します。実際にプロパティを取得できますが、Xcodeから次の警告が表示されます。

newClassプロパティは、.hファイルと.mファイルで正しく宣言されており、プロパティが設定され、合成されています。

コンパイルして実行し、実際にプロパティの値を取得できます。

Xcodeの警告を無視する必要がありますか?

myClassインスタンスのプロパティにアクセスするためのより良い方法はありますか?

0 投票する
4 に答える
4256 参照

iphone - ジェネリック NSCoding 実装のための Objective-C リフレクション

オブジェクトのパブリック プロパティを検査し、encodeWithCoder: および initWithCoder: の汎用実装を生成することにより、汎用 NSCoding 実装を記述できるようにする、Objective-C のリフレクションの手段はありますか。

リフレクションを使用してJavaオブジェクトをシリアル化および逆シリアル化する一般的な方法を可能にするXStream for Javaのようなものを考えています。さらに良いのは、プロパティをシリアライズしたいもの、または一時的なものとしてマークする手段です (Java の一時的なキーワードのように)。

Archives and Serializations Programming Guide for Cocoaのドキュメントを読んでいます。オブジェクトのシリアル化をある程度制御したいということは理解していますが、それは一般的に対称的なプロセスであり、シリアル化のためにコード化されているものを逆シリアル化する必要があるのは奇妙に思えます。私は DRY の信奉者です (同じことを繰り返さないでください)。

0 投票する
5 に答える
1561 参照

objective-c - モダン ランタイムでのインスタンス変数の使用

私は Obj-c と Cocoa で数年の経験がありますが、Obj-C 2.0 などの進歩に戻ってきたばかりです。

私は最新のランタイムとプロパティの宣言などに頭を悩ませようとしています。私を少し混乱させることの 1 つは、最新のランタイムで iVar を暗黙的に作成できることです。そしてもちろん、これはコード内で常に self.property を使用して値にアクセスする必要があることを意味します。

ただし、init* および dealloc (GC を使用していないと仮定) メソッドでは、(現在のランタイムで) iVar を直接使用する必要があります。

質問は次のとおりです。

  1. init* でプロパティ アクセサーを使用し、最新のランタイムで dealloc を使用する必要がありますか?

  2. もしそうなら、なぜこれは違うのですか?コンパイラが iVar を認識できないからですか?

  3. アクセサーをオーバーライドする必要がある場合、実行時に定義される iVar に引き続きアクセスできますか? または、ランタイムが使用する実際の iVar を定義する必要がありますか?

  4. 繰り返しますが、合成された iVar にアクセスできる場合、 init* および dealloc メソッドに対してこれを続けられないのはなぜですか?

ドキュメントを何度か読みましたが、これらすべてについて少し曖昧に思えたので、どのようにコーディングを続けたいかを決定するために、よく理解していることを確認したいと思います。

私の質問が明確であることを願っています。


テストの簡単な要約:

  1. レガシーでivarを宣言しないと、コンパイラは完全に不満です

  2. #ifndef __OBJC2__レガシーコンパイラで ivarを使用する場合は満足であり、 ivar を直接およびプロパティとして使用できます

  3. 最新のランタイムでは、ivar を未定義のままにして、プロパティとしてアクセスできます

  4. 最新のランタイムでは、宣言なしで ivar に直接アクセスしようとすると、コンパイル中にエラーが発生します

  5. @privateもちろん、ivar の宣言により、レガシーとモダンの両方で ivar に直接アクセスできます。

今のところ、前に進むための明確な方法を本当に提供していませんか?

0 投票する
2 に答える
783 参照

objective-c - Objective-C ランタイムの IBOutlet のような構造

IBOutlets についての私の理解では、IBOutlets は Objective-C クラスの ivar とプロパティへのマーカーとして機能するということです。Objective-C ランタイムには、ivar、プロパティ、またはクラスが実行時に IBOutlet でマークされているかどうかを照会できるものはありますか? それとも、XCode はコンパイル時にこれらを巧妙に処理するのでしょうか?

それらがランタイム構成である場合、独自のマーカーを定義して次のように使用することは可能ですか:

0 投票する
3 に答える
9006 参照

objective-c - Objective-C でオブジェクトのすべてのフィールドを一覧表示するにはどうすればよいですか?

クラスがある場合、そのすべてのインスタンス変数名を一覧表示するにはどうすればよいですか?

例えば:

「myInt」、「myString」、および「myArray」を取得したいと思います。繰り返し処理できる名前の配列を取得する方法はありますか?

Objective-C のドキュメントを検索してみましたが、何も見つかりませんでした (これが何と呼ばれているのかもわかりません)。

0 投票する
2 に答える
2311 参照

objective-c - object_getIvar(id object, Ivar ivar) の戻り値の扱い

1) object_getIvar(id object, Ivar ivar) は、Ivar がオブジェクトの場合、「id」を返します。変数が NSString の場合、おそらく値を含む id = NSString です。あれは正しいですか?または、Ivar の値にアクセスするにはどうすればよいでしょうか。

2) Ivar が float/int などの場合、返されるものと、それを使用できるものに変換する方法 (NSNumber numberWithXXX を使用してオブジェクトに変換できるため、float または int で問題ありません)。

0 投票する
5 に答える
5436 参照

objective-c - ポインターを返すので、object_getIvar(self, myIntVar) から int 値を取得するにはどうすればよいですか

object_getIvar の変数が基本データ型 (float、int、bool など) の場合、ドキュメントに従って関数がポインター (id) を返すため、値を取得するにはどうすればよいですか。int、int* にキャストしようとしましたが、それを NSLog に取得しようとすると、互換性のないポインター型に関するエラーが発生します。