Objective-Cのイントロスペクション/リフレクション
2023-08-12 04:07:38
質問
Objective-C、特に Apple の Cocoa/Cocoa-Touch 環境で、インスタンス化されたオブジェクトの内容をダンプするための組み込みのメソッド、関数、API、一般に認められた方法などはありますか。
私は以下のようなことを行えるようにしたいです。
MyType *the_thing = [[MyType alloc] init];
NSString *the_dump = [the_thing dump]; //pseudo code
NSLog("Dumped Contents: %@", the_dump);
で、オブジェクトのインスタンス変数の名前と値、および実行時に呼び出せるメソッドが表示されます。読みやすい形式が理想的です。
PHPに詳しい開発者のために、私は基本的にリフレクション関数に相当するものを探しています(
var_dump()
,
get_class_methods()
) と OO Reflection API があります。
どのように解決するのですか?
UPDATEしてください。 このようなことをしたい人は、以下をチェックするとよいでしょう。 Mike AshによるObjective-CランタイムのためのObjCラッパーです。 .
多かれ少なかれ、こんな感じでしょうか。
#import <objc/runtime.h>
. . .
-(void)dumpInfo
{
Class clazz = [self class];
u_int count;
Ivar* ivars = class_copyIvarList(clazz, &count);
NSMutableArray* ivarArray = [NSMutableArray arrayWithCapacity:count];
for (int i = 0; i < count ; i++)
{
const char* ivarName = ivar_getName(ivars[i]);
[ivarArray addObject:[NSString stringWithCString:ivarName encoding:NSUTF8StringEncoding]];
}
free(ivars);
objc_property_t* properties = class_copyPropertyList(clazz, &count);
NSMutableArray* propertyArray = [NSMutableArray arrayWithCapacity:count];
for (int i = 0; i < count ; i++)
{
const char* propertyName = property_getName(properties[i]);
[propertyArray addObject:[NSString stringWithCString:propertyName encoding:NSUTF8StringEncoding]];
}
free(properties);
Method* methods = class_copyMethodList(clazz, &count);
NSMutableArray* methodArray = [NSMutableArray arrayWithCapacity:count];
for (int i = 0; i < count ; i++)
{
SEL selector = method_getName(methods[i]);
const char* methodName = sel_getName(selector);
[methodArray addObject:[NSString stringWithCString:methodName encoding:NSUTF8StringEncoding]];
}
free(methods);
NSDictionary* classDump = [NSDictionary dictionaryWithObjectsAndKeys:
ivarArray, @"ivars",
propertyArray, @"properties",
methodArray, @"methods",
nil];
NSLog(@"%@", classDump);
}
そこから、インスタンスのプロパティの実際の値を取得するのは簡単ですが、プリミティブ型かオブジェクトかを確認する必要があるので、面倒なので入れませんでした。また、継承チェーンをスキャンして 全て オブジェクトに定義されたプロパティを取得することもできます。それから、カテゴリに定義されたメソッド、さらに...。しかし、ほとんどすべてがすぐに利用可能です。
以下は、上記のコードがUILabelに対してダンプする内容の抜粋です。
{
ivars = (
"_size",
"_text",
"_color",
"_highlightedColor",
"_shadowColor",
"_font",
"_shadowOffset",
"_minFontSize",
"_actualFontSize",
"_numberOfLines",
"_lastLineBaseline",
"_lineSpacing",
"_textLabelFlags"
);
methods = (
rawSize,
"setRawSize:",
"drawContentsInRect:",
"textRectForBounds:",
"textSizeForWidth:",
. . .
);
properties = (
text,
font,
textColor,
shadowColor,
shadowOffset,
textAlignment,
lineBreakMode,
highlightedTextColor,
highlighted,
enabled,
numberOfLines,
adjustsFontSizeToFitWidth,
minimumFontSize,
baselineAdjustment,
"_lastLineBaseline",
lineSpacing,
userInteractionEnabled
);
}
関連
-
[解決済み] リフレクションを使用して文字列からプロパティ値を取得する
-
[解決済み] Objective-CでNSStringsを連結するためのショートカット集
-
[解決済み] Objective-Cの定数
-
[解決済み] Objective-Cで乱数を発生させる
-
[解決済み] リフレクションとは何か、なぜ有用なのか?
-
[解決済み] Objective-Cで、ある文字列が他の文字列を含んでいるかどうかを調べるにはどうすればよいですか?
-
[解決済み] リフレクションを使ってジェネリックメソッドを呼び出すにはどうしたらいいですか?
-
[解決済み] Objective-Cのtypedef enumとは何ですか?
-
[解決済み] SwiftからObjective-Cのコードを呼び出すにはどうしたらいいですか?
-
[解決済み] Objective-Cでデリゲートを作成するにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Objective-CのクラスでSwiftのプロトコルをインポートする
-
[解決済み] 数字の後に "f "をつける
-
[解決済み] NSTimeInterval(秒)を分単位に変換する方法
-
[解決済み] NSStringの最初の3文字を取得するには?
-
[解決済み] MKMapViewのアノテーションをすべて削除する方法
-
[解決済み] BOOLのデフォルト値
-
[解決済み] iOSアプリケーションの最上位ビュー/ウィンドウへの参照取得
-
[解決済み] ARCはディスパッチキューをサポートしていますか?
-
[解決済み] ViewController の respondsToSelector: 割り当て解除されたインスタンスにメッセージが送信される (CRASH)
-
[解決済み] Objective-CのクラスからSwiftの関数を呼び出す