我使用此方法记录给定类的实例变量。我有一个包含Apples API中所有类的数组,我在这个方法中使用该数组作为给定的类。但我一直收到一个警告(下面的警告),我认为是什么导致它在控制台的实例部分下没有记录任何内容。我有另一种几乎与此相同的方法,它记录了一个效果很好的给定类的方法。
方式: NSArray * BNRInstanceVariables(Class cls){
const char instanceCount = 0;
Method *instanceList = class_getInstanceVariable(cls, &instanceCount);
NSMutableArray *instanceArray = [NSMutableArray array];
for (int j = 0; j < instanceCount; j++) {
Method currentMethod = instanceList[j];
SEL methodSelector = method_getName(currentMethod);
[instanceArray addObject:NSStringFromSelector(methodSelector)];
}
return instanceArray;
}
警告: 不兼容的指针类型初始化&#39;方法*&#39; (又名&#39; struct objc_method **&#39;)表达式为&#39; Ivar&#39; (又名&#39; struct objc_ivar *&#39;)
结果:
classname = "__NSTaggedDate";
hierarchy = (
NSObject,
NSDate,
"__NSTaggedDate"
);
instance = (
);
methods =
回答问题: 我想通了!!! 这是更新的代码。感谢nkongara,我将Method class_getInstanceVariable更改为Ivar * class_copyIvarList并修复了它,但是我的方法currentMethod行有另一个问题,所以我将Method更改为Ivar并再次解决,但又提出了另一个问题,所以最后但并非最不重要的是我更改了SEL line到const char * ivar_getName()。
NSArray *BNRInstanceVariables(Class cls) {
unsigned int instanceCount = 0;
Ivar* ivars = class_copyIvarList(cls, &instanceCount);
NSMutableArray *instanceArray = [NSMutableArray array];
for (int j = 0; j < instanceCount; j++) {
Ivar currentMethod = ivars[j];
const char* name = ivar_getName(currentMethod);
[instanceArray addObject:NSStringFromSelector(name)];
}
return instanceArray;
}
答案 0 :(得分:0)
class_getInstanceVariable
仅返回给定名称的实例变量
您应该使用Ivar * class_copyIvarList(Class cls, unsigned int *outCount)
来检索类的实例变量。
以下代码打印一个类中的所有ivars。
unsigned int count;
Ivar* ivars = class_copyIvarList(cls, &count);
for(unsigned int i = 0; i < count; ++i)
{
NSLog(@"%@::%s", cls, ivar_getName(ivars[i]));
}