不兼容的指针类型初始化'Method *'C

时间:2014-02-19 14:49:01

标签: objective-c c arrays class pointers

我使用此方法记录给定类的实例变量。我有一个包含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;
}

1 个答案:

答案 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]));
}