realloc() & ARC
Asked Answered
L

1

8

How would I be able to rewrite the the following utility class to get all the class string values for a specific type - using the Objective-c runtime functions as shown below?

The ARC documentation specifically states that realloc should be avoided and I also get the following compiler error on this this line:

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

"Implicit conversion of a non-Objective-C pointer type 'void *' to '__unsafe_unretained Class *' is disallowed with ARC"

The the below code is a reference to the original article which can be found here.

+ (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;
}

Your help will be much appreciated.

Leanneleanor answered 11/7, 2012 at 14:15 Comment(3)
Do an explicit cast (void *) classList. Also consider not using realloc. What are you trying to accomplish here?Desperation
Do you really need to run the code with ARC, or would it be acceptable for you to run the code in non-ARC mode (-fno-objc-arc flag in de target build settings for the classes where you want to disable ARC). See: #6646552Tori
@WolfgangSchreurs Thanks, I totally forgot about the linker flag option.Leanneleanor
C
16

ARC forces you to be more explicit with you memory management. In this case, you just need to explicitly cast the output of realloc:

classList = (Class *)realloc(classList, sizeof(Class) * numClasses);
Cuenca answered 11/7, 2012 at 15:13 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.