記述方法からiVarを出力しますか?
-
10-07-2019 - |
質問
ここでポイントを逃して混乱しているだけだと確信しています。インスタンス変数の値をコンソールに出力するオブジェクトの簡単な説明を書く方法を教えてください。
また:とにかくブロックとして情報を表示する方法があります(つまり、10個のiVarがある場合、それらすべてを1つずつ返すのが苦痛になります)
@interface CelestialBody : NSObject {
NSString *bodyName;
int bodyMass;
}
- (NSString *)description {
return (@"Name: %@ Mass: %d", bodyName, bodyMass);
}
歓声-gary-
解決
- (NSString*)description
{
return [NSString stringWithFormat:@"Name: %@\nMass: %d\nFoo: %@",
bodyName, bodyMass, foo];
}
他のヒント
この質問。コードを以下に再現します。
unsigned int varCount;
Ivar *vars = class_copyIvarList([MyClass class], &varCount);
for (int i = 0; i < varCount; i++) {
Ivar var = vars[i];
const char* name = ivar_getName(var);
const char* typeEncoding = ivar_getTypeEncoding(var);
// do what you wish with the name and type here
}
free(vars);
Jasonが書いたように、stringWithFormat:を使用して、printfのような構文で文字列をフォーマットする必要があります。
-(NSString*)description;
{
return [NSString stringWithFormat:@"Name: %@ Mass: %d", bodyName, bodyMass];
}
多くのクラスでこれを何度も書くのを避けるために、NSObjectにインスタンス変数を簡単に検査できるカテゴリを追加できます。これはパフォーマンスの低下になりますが、デバッグ目的には機能します。
@implementation NSObject (IvarDictionary)
-(NSDictionary*)dictionaryWithIvars;
{
NSMutableDictionary* dict = [NSMutableDictionary dictionary];
unsigned int ivarCount;
Ivar* ivars = class_copyIvarList([self class], &ivarCount);
for (int i = 0; i < ivarCount; i++) {
NSString* name = [NSString stringWithCString:ivar_getName(ivars[i])
encoding:NSASCIIStringEncoding];
id value = [self valueForKey:name];
if (value == nil) {
value = [NSNull null];
}
[dict setObject:value forKey:name];
}
free(vars);
return [[dict copy] autorelease];
}
@end
これを適切に実装すると、説明の実装も簡単になります:
-(NSString*)description;
{
return [[self dictionaryWithIvars] description];
}
この description
をNSObjectのカテゴリとして追加しないでください。追加すると、無限に再帰することになります。
それはあなたがそこに何を持っているか悪い考えではありません、それもほとんど達成可能です。
// choose a short name for the macro
#define _f(x,...) [NSString stringWithFormat:x,__VA_ARGS__]
...
- (NSString *) description
{
return _f(@"Name: %@ Mass: %d", bodyName, bodyMass);
}
所属していません StackOverflow