2012-07-11 5 views
7

Objective-c 런타임 함수를 사용하여 특정 유형의 모든 클래스 문자열 값을 가져 오려면 다음 유틸리티 클래스를 어떻게 다시 작성할 수 있습니까? *realloc() & ARC

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

"비 목표 - C의 포인터 타입의 암시 적 변환 '무효 :

는 ARC 문서는 특히 realloc을 피해야한다한다고 나는이에이 줄을 다음과 같은 컴파일러 오류 'to'__unsafe_unretained 클래스 * '은 (는) ARC에서 허용되지 않습니다. "

아래 코드는 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; 
} 

귀하의 도움을 많이 주시면 감사하겠습니다.

+0

명시 적 캐스트 (void *) classList를 수행하면됩니다. realloc을 사용하지 않는 것도 고려하십시오. 여기서 무엇을하려고합니까? – Dustin

+2

정말 ARC로 코드를 실행해야합니까, 아니면 비 ARC 모드에서 코드를 실행할 수 있습니까? (원하는 경우 원하는 클래스의 타겟 빌드 설정에서'-fno-objc-arc' 플래그 사용) ARC 비활성화). 참조 : http://stackoverflow.com/questions/6646052/how-can-i-disable-arc-for-a-single-file-in-a-project –

+0

@WolfgangSchreurs 고마워, 나는 링커 플래그 옵션을 완전히 잊어 버렸다. . – RynoB

답변

13

ARC를 사용하면 메모리 관리를보다 명확하게 할 수 있습니다. 이 경우 명시 적으로 realloc의 출력을 캐스팅해야합니다.

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

고마워요, 이것이 제가 찾고 있던 것이 었습니다! – RynoB

+0

좌절의 시간을 절약 해 주셔서 감사합니다. –