2012-07-11 12 views
7

Jak mógłbym przepisać następującą klasę narzędzi, aby uzyskać wszystkie wartości łańcucha klasy dla określonego typu - przy użyciu funkcji środowiska wykonawczego Objective-c, jak pokazano poniżej?realloc() i ARC

Dokumentacja ARC wyraźnie stwierdza, że ​​realloc należy unikać, a ja również otrzymuję następujący błąd kompilatora na ten wiersz:

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

„niejawna konwersja typu wskaźnika non-Objective-C„void * "do" __unsafe_unretained Class * "jest niedozwolone przez ARC"

Poniższy kod jest odniesieniem do oryginalnego artykułu, który można znaleźć pod numerem 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; 
} 

Twoja pomoc będzie bardzo cenna.

+0

Wykonaj wyraźną klasę rzutowania (void *). Rozważ także nie używanie realloc. Co próbujesz osiągnąć tutaj? – Dustin

+2

Czy naprawdę potrzebujesz uruchomić kod za pomocą ARC, lub byłoby to możliwe do uruchomienia kodu w trybie innym niż ARC (flaga '-fno-objc-arc' w ustawieniach de-budowania dla klas, w których chcesz wyłącz ARC). Zobacz: http://stackoverflow.com/questions/6646052/how-can-i-disable-arc-for-a-single-file-in-a-project –

+0

@WolfgangSchreurs Dzięki, całkowicie zapomniałem o opcji flagi linkera . – RynoB

Odpowiedz

13

ARC zmusza Cię do bardziej wyraźnego zarządzania pamięcią. W takim przypadku wystarczy rzutować jawnie dane wyjściowe polecenia realloc:

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

Dzięki, to było dokładnie to, czego szukałem! – RynoB

+0

Dziękujemy za oszczędność godzin frustracji. –