2012-07-11 18 views
7

नीचे दिखाए गए उद्देश्य-सी रनटाइम फ़ंक्शंस का उपयोग करके सभी क्लास स्ट्रिंग मानों को किसी विशिष्ट प्रकार के लिए प्राप्त करने के लिए मैं निम्न उपयोगिता वर्ग को फिर से लिखने में सक्षम कैसे हो सकता हूं?realloc() और एआरसी

एआरसी प्रलेखन विशेष रूप से कहा गया है कि realloc से बचा जाना चाहिए और मैं भी इस लाइन इस पर निम्नलिखित संकलक त्रुटि मिलती है:

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

"एक गैर ऑब्जेक्टिव-सी सूचक प्रकार के अंतर्निहित रूपांतरण 'शून्य * 'to' __unsafe_unretained क्लास * 'एआरसी के साथ अस्वीकृत है "

नीचे दिया गया कोड मूल आलेख का संदर्भ है जो 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

एक स्पष्ट कलाकार (शून्य *) क्लासलिस्ट करें। रीयलोक का उपयोग न करने पर भी विचार करें। आप यहां क्या करने की कोशिश कर रहे हैं? – Dustin

+2

क्या आपको वास्तव में एआरसी के साथ कोड चलाने की आवश्यकता है, या यह आपके लिए स्वीकार्य होगा कि आप गैर-एआरसी मोड में कोड चलाने के लिए स्वीकार्य हों ('-fno-objc-arc' ध्वज उन वर्गों के लिए लक्ष्य निर्माण सेटिंग्स में जहां आप चाहते हैं एआरसी अक्षम करें)। देखें: http://stackoverflow.com/questions/6646052/how-can-i-disable-arc-for-a-single-file-in-a-project –

+0

@WolfgangSchreurs धन्यवाद, मैं पूरी तरह से लिंकर ध्वज विकल्प के बारे में भूल गया । – RynoB

उत्तर

13

एआरसी आपको स्मृति प्रबंधन के साथ अधिक स्पष्ट होने के लिए मजबूर करता है। इस मामले में, आपको केवल realloc के आउटपुट को स्पष्ट रूप से डालने की आवश्यकता है:

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

धन्यवाद, यह वही था जो मैं ढूंढ रहा था! – RynoB

+0

निराशा के घंटों को बचाने के लिए धन्यवाद। –