Ios @类型id的编码,其中id实际上是任何对象
我有以下方法Ios @类型id的编码,其中id实际上是任何对象,ios,objective-c,types,runtime,objective-c-runtime,Ios,Objective C,Types,Runtime,Objective C Runtime,我有以下方法 - (void)someObject:(id)obj { char* encoding = @encoding(typeof(obj)); NSString *s = [NSString stringWithCString:encoding encoding:NSUTF8StringEncoding]; NSLog(s); } 无论我在obj中传递类型为NSNumber、NSArray、NSDictionary或NSString的变量,此方法始终返回@“@”。我假设它
- (void)someObject:(id)obj {
char* encoding = @encoding(typeof(obj));
NSString *s = [NSString stringWithCString:encoding encoding:NSUTF8StringEncoding];
NSLog(s);
}
无论我在obj中传递类型为NSNumber、NSArray、NSDictionary或NSString的变量,此方法始终返回@“@”
。我假设它正在检查obj
指针类型
我必须做什么才能使它返回我传递的变量的实际类型编码?@encode()
是编译时构造;它只知道变量的类型,而不知道运行时将包含在对象中的对象的类。任何对象类型的变量都将编码为@
您必须使用运行时检查,询问对象的类,以实现您的目标。您所说的“变量类型编码”是什么意思?你在期待什么?关键是取消引用id
不透明类型是没有意义的(因此@encode响应是正确的,因为id
是一个对象,意思是@
)……出于好奇,你想用它做什么?@HepaKKes:我试图从字典中为类的ivar赋值。我有一个ivar列表(使用class_copyIvarList())和ivar类型(使用ivar_getTypeEncoding()),现在我想确保ivar中填充了兼容的值。(例如,NSArray ivar应填写NSArray)。我可以使用isKindOfClass进行if/else检查,但我在想是否有其他方法可以比较ivar的类型编码和传入参数。@Merlevede:请参阅我上面的评论,