2012-07-11 41 views
7

我該如何重寫下面的工具類來獲取特定類型的所有類字符串值 - 使用如下所示的Objective-c運行時函數?realloc()&ARC

電弧文檔特別指出的realloc應避免與我還獲得以下編譯器錯誤有關此這一行:

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

「非目標C指針類型的隱式轉換「void *的'to'__unsafe_unretained Class *'不允許使用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 2012-07-11 14:18:12

+2

你是否真的需要用ARC運行代碼,或者在非ARC模式下運行代碼是可以接受的(在你想要的類的目標構建設置中的'-fno-objc-arc'標誌禁用ARC)。請參閱:http://stackoverflow.com/questions/6646052/how-can-i-disable-arc-for-a-single-file-in-a-project – 2012-07-11 14:22:21

+0

@WolfgangSchreurs謝謝,我完全忘記了鏈接器標誌選項。 – RynoB 2012-07-17 11:32:32

回答

13

ARC迫使你更加明確地對待你的記憶管理。在這種情況下,你只需要明確地投射realloc的輸出:

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

謝謝,這正是我一直在尋找的! – RynoB 2012-07-17 11:30:35

+0

感謝您節省數小時的沮喪。 – 2013-04-20 01:19:29