8

以下に示すように、Objective-c ランタイム関数を使用して、次のユーティリティ クラスを書き直して、特定の型のすべてのクラス文字列値を取得するにはどうすればよいでしょうか?

ARC のドキュメントには、realloc は避けるべきであると明確に記載されており、この行で次のコンパイラ エラーも発生します。

classList = realloc(classList, sizeof(Class) * numClasses);

「Objective-C 以外のポインター型 'void *' から '__unsafe_unretained Class *' への暗黙的な変換は、ARC では許可されていません」

以下のコードは、ここにある元の記事への参照です。

+ (NSArray *)classStringsForClassesOfType:(Class)filterType {

    int numClasses = 0, newNumClasses = objc_getClassList(NULL, 0);
    Class *classList = NULL;

    while (numClasses < newNumClasses) {
        numClasses = newNumClasses;
        classList = realloc(classList, sizeof(Class) * numClasses);
        newNumClasses = objc_getClassList(classList, numClasses);
    }

    NSMutableArray *classesArray = [NSMutableArray array];

    for (int i = 0; i < numClasses; i++) {
        Class superClass = classList[i];
        do {
            superClass = class_getSuperclass(superClass);
            if (superClass == filterType) {
                [classesArray addObject:NSStringFromClass(classList[i])];
                break;
            }           
        } while (superClass);       
    }

    free(classList);

    return classesArray;
}

あなたの助けは大歓迎です。

4

1 に答える 1

16

ARC では、メモリ管理をより明確にする必要があります。この場合、realloc の出力を明示的にキャストする必要があります。

classList = (Class *)realloc(classList, sizeof(Class) * numClasses);
于 2012-07-11T15:13:18.213 に答える