2009-10-26 14 views
13

में गुणों के रूप में enum प्रकारों का उपयोग करना मैं एक अनुभवी .NET डेवलपर उद्देश्य सी प्रोग्रामिंग में अपना पहला प्रयास कर रहा हूं। मुझे एक enum प्रकार की संपत्ति के साथ कठिनाई हो रही है।उद्देश्य सी

typedef enum { 
    Open, 
    Unavailable, 
    Unknown 
} LocationStatus; 

@interface Location : NSObject { 

    LocationStatus status; 
} 

@property (nonatomic) LocationStatus status; 

@end 

और एक कार्यान्वयन है कि इस तरह दिखता है:: कुछ संदर्भ ... मैं एक वर्ग शीर्षक और enum इस तरह है

@implementation Location 

@synthesize status; 

@end 

कोड में कुछ बिंदु पर, मैं मान सेट कर रहा हूँ इस तरह:

location1.status = Open; 

डिबगर तो सही मान होने के रूप में यह मूल्यांकन करता है, और यह सही enum को हल करने है (ध्यान दें भी अन्य संपत्तियों के यहाँ नहीं दिखाया देखते हैं कि ... वे भी ठीक से मूल्यांकन)।

बाद कोड में पर, मैं इस तरह है कि संपत्ति को पढ़ने के लिए प्रयास: कोड में इस बिंदु पर

LocationStatus status = location.status; 

, डिबगर Status को छोड़कर, सही ढंग से मेरी कक्षा के सभी गुण का मूल्यांकन करने में सक्षम है, जो एक स्मृति पता दिखाता है, लेकिन वास्तविक मूल्य नहीं। जब निष्पादन इस पंक्ति तक पहुंचता है, तो मुझे लगातार कंसोल में EXC_BAD_ACCESS त्रुटि मिलती है, और ऐप क्रैश हो जाता है।

मुझे पूरा यकीन है कि यह उद्देश्य सी (और संभवतः सामान्य रूप से सी) में गुणों और enums का उपयोग करने के तरीके पर मेरे हिस्से पर एक मौलिक गलतफहमी को दर्शाता है। अगर कोई इस पर कुछ प्रकाश डाल सकता है, तो मैं सबसे आभारी हूं।

उत्तर

5

EXC_BAD_ACCESS लगभग हमेशा इसका मतलब है कि आप किसी ऑब्जेक्ट के संदर्भ का उपयोग करने का प्रयास कर रहे हैं जिसे हटाया गया है (आमतौर पर एक ओवर-रिलीज़ बग)। इसे ट्रैक करने पर सलाह के लॉट को खोजने के लिए SO पर उस त्रुटि की खोज करें।

+0

यह मेरा पहला विचार था ... कि मैं कहीं भी मूल्य जारी कर दूंगा। मुझे भ्रमित करने वाला यह है कि कोड की एक खोज से पता चलता है कि पूरे कोडबेस में केवल एक ही स्थान है कि इस संपत्ति को एक मूल्य दिया गया है, और ब्रेकपॉइंट डालने से यह साबित होता है कि यह असाइनमेंट केवल एक बार हो रहा है।इसके अतिरिक्त, क्योंकि स्थानस्टैटस एक enum है, मुझे इसे आवंटित करने की आवश्यकता नहीं है, जिसका अर्थ है कि मैं यह निर्दिष्ट नहीं कर सकता कि यह कैसे जारी किया गया है (मैं यहां गलत होने के लिए पूरी तरह से खुला हूं, आपको याद है)। तो इसे जल्दी कैसे जारी किया जा सकता है और मैं इसे कैसे रोक सकता हूं? क्या एनम मूल्यों को आवंटित करने का कोई बेहतर तरीका है? –

+0

मेरा पहला विचार यह होगा कि जो चीज समाप्त हो चुकी है वह उस असाइनमेंट में आपके स्थान चर की सामग्री है। लेकिन लाश चालू करें, और आप निश्चित रूप से देख सकते हैं! –

7

इसका उत्तर देने में बहुत देर हो सकती है लेकिन मैंने आपके कोड में एक चीज़ देखी है। आप कोड स्थान 1 और स्थान (1 के बिना) में 2 अलग-अलग चर का उपयोग कर रहे हैं।

EXEC_BAD_ACCESS आम तौर पर इसका मतलब है कि आप किसी ऑब्जेक्ट को संदेश भेजने की कोशिश कर रहे हैं जो मौजूद नहीं है। आमतौर पर ऐसा इसलिए होता है क्योंकि इसे हटा दिया गया है। हालांकि, आपके मामले में ऐसा प्रतीत होता है कि यह पहले स्थान पर कभी अस्तित्व में नहीं था।

जैसा कि आपने देखा है कि आप एक enum आवंटित नहीं करते हैं। लेकिन यह समस्या नहीं है कि समस्या है। उद्देश्य-सी में "डॉट" वाक्यविन्यास एक एक्सेसर संदेश भेजने के लिए बस एक छोटा सा कट है।

आपका कोड के बराबर है:

LocationStatus status = [location status]; 

न के बराबर स्थान वस्तु को संश्लेषित -(LocationStatus)status{} संदेश भेजता है कि (जब तक कि बेशक location1 सिर्फ अपनी पोस्ट लिखने में कोई गलती थी, लेकिन अपने कोड में नहीं है, जो मेरी टिप्पणी अप्रासंगिक बनाता है)। तो बस location.status से location1.status बदलें और आपको जाने के लिए अच्छा होना चाहिए (बेशक, location1 इसे संदेश भेजने से पहले जारी किया जा रहा है)।