2012-06-22 16 views
10

के तहत ऑब्जेक्टिव-सी ऑब्जेक्ट्स के पॉइंटर्स की सी-स्टाइल सरणी मेरे पास मैप ग्रिड पर गेम ऑब्जेक्ट्स का ट्रैक रखने के लिए ऑब्जेक्टिव-सी उदाहरणों के पॉइंटर्स की 2 डी सरणी है। अब मैं अपना कोड एआरसी में बदल रहा हूं, और एक्सकोड ने त्रुटि की ओर इशारा किया। मुझे पता था कि ऑब्जेक्ट्स के पॉइंटर्स को स्ट्रक्चर सदस्यों के रूप में अनुमति नहीं है, लेकिन इसने मुझे गार्ड से लगभग (लगभग) पकड़ा।एआरसी

मैं एआरसी constrains के पीछे तर्क समझते हैं, लेकिन:

  1. मैं उद्देश्य सी सरणियों के भूमि के ऊपर जब ग्रिड में वस्तुओं को देख बर्दाश्त नहीं कर सकते हैं, और

  2. वस्तुओं स्वयं पहले से ही उसी श्रेणी में परिभाषित NSArray ivar के स्वामित्व में हैं जिनके पास सी-स्टाइल ग्रिड एक ivar है; सी-शैली सरणी केवल एक सुविधाजनक संरचित शॉर्टकट है। फ़्यूथरमोर, जब ऑब्जेक्ट NSArray के स्वामित्व से हटा दिए जाते हैं, तो मैंने संबंधित ग्रिड स्लॉट NULL पर सेट किया है।

है, 2 डी सरणी (ग्रिड) सिर्फ वस्तुओं को सुरक्षित रूप से कहीं और बनाए रखा करने के लिए तेजी से (लेकिन गूंगा) संकेत (NSArray इवर) ​​का एक संग्रह है।

क्या इसकास्ट का उपयोग करके इस से दूर जाने का कोई तरीका है? उदाहरण के लिए, को परिभाषित करने और के रूप में अपने ग्रिड alloc:

void*** _grid; 

बजाय

MyMapObjectClass*** _grid 

और का उपयोग करें (उचित रूप से पाट) के बीच डाले void* < ->MyMapObjectClass* सेट करते समय या प्रत्येक स्लॉट में संकेत मिल रहा है?

संपादित: तो यहाँ मैं इसे कैसे

हल मैं जैसा कि ऊपर वर्णित इवर घोषणा बदल रहा है। इसके अलावा, जब मेरे लुक-अप ग्रिड के एक प्रवेश की स्थापना, मैं इस किया था:

MyMapObjectClass* object = (__bridge MyMapObjectClass*) _grid[x][y]; 

[object performSomeMethod]; 

// etc... 

जब दूर करने:

// (Done **Only Once** at map initialization) 
// _objectArray is an instance of NSMutableArray 

MyMapObjectClass* mapObject = [[MyMapObjectClass alloc] init]; 

// ...configure map object, etc... 

// Add to Obj-C array: 
[_objectArray addObject:mapObject]; 

// Add pointer to 2D C array: 
_grid[i][j] = (__bridge void*)mapObject; 

जब (एक्स, वाई) पर वस्तु तक पहुँचने, मैं विपरीत करना नक्शे से वस्तु, मैं यह कर:

MyMapObjectClass* object = (__bridge MyMapObjectClass*) _grid[x][y]; 

[_objectArray removeObject:object]; 

_grid[x][y] = NULL; 

मानचित्र वस्तुओं खेल प्रगति के अनुसार खेल की शुरुआत में एक बार बनाई गई हैं, और हटा दिया। अगर मैं की जरूरत की जगह किसी अन्य के लिए एक नक्शा वस्तु, मैं इस करना होगा:

MyMapObjectClass* oldObject = (__bridge MyMapObjectClass*) _grid[x][y]; 
// (should mark as weak?) 

[_objectArray removeObject:oldObject];  
_grid[x][y] = NULL; 

MyMapObjectClass* newObject = [[MyMapObjectClass alloc] init]; 

[_objectArray addObject:newObject]; 

_grid[x][y] = (__bridge void*)newObject; 
+0

एआरसी इंगित करने वाले कोड की रेखा कहां है? –

+0

एक्सकोड एक ही समय में सभी त्रुटियों को इंगित नहीं करता है, बल्कि इसके बजाय 4-12 के बैचों में। आप कुछ ठीक करते हैं, और अगले वाले निम्नलिखित चेक में दिखाई देते हैं। पहली त्रुटि सी-सरणी की ivar घोषणा में दिखाई दी। और अब, obj-c सूचक और शून्य * के बीच प्रत्येक असाइनमेंट या तुलना संकेत दिया जा रहा है। मैं अभी इसे ठीक कर रहा हूं, और ऐसा लगता है कि __bridge को काम करना चाहिए ... –

+0

यह उत्सुक है, कुछ कास्ट एक्सकोड की स्वत: सुधार सुविधा द्वारा 'सुझाए गए' हैं, लेकिन कुछ को सिर्फ त्रुटियों के रूप में चिह्नित किया गया है। –

उत्तर

2

circumventing एआरसी डाले का उपयोग कर आम तौर पर एक बुरा विचार है। बेहतर नक्शा disable ARC आपके मानचित्र.एम (या सिर्फ एक अलग वर्ग में लुकअप भाग को तोड़ने के लिए) होगा। फिर मैन्युअल मेमोरी प्रबंधन retain/release और सी संरचनाओं को आप पसंद करते हैं, जब तक आप इसे करते हैं सही ढंग से यह ठीक काम करेगा और आप इसे अन्य कक्षाओं से कॉल करने में सक्षम होंगे, नेस्टेड NSArrays आदि के ओवरहेड से परहेज करेंगे।

+0

लेकिन पॉइंटर्स मेरे पास काम करते हैं __unsafe_unretained। मैं एआरसी को घुमा नहीं रहा हूं, सिर्फ __bridge का उपयोग कर रहा हूं; कोई समस्या नहीं होनी चाहिए। मैं एनएसएआरएआरई और सी सरणी को सिंक में रख रहा हूं। वस्तुओं को एनएसएआरएआरई (एआरसी के अनुसार) द्वारा बनाए रखा जाता है। पॉइंटर्स को लटकने का कोई खतरा नहीं है। –

+1

इसे स्पष्ट करने के लिए: मेरे पास एक एआरसी-अनुकूल एनएसएआरएआर है जो मेरी वस्तुओं का मालिक है, 100% उद्देश्य-सी, 100% एआरसी। ** इसके अतिरिक्त **, मेरे पास पंक्तियों/स्तंभ फैशन में मेरी ऑब्जेक्ट्स तक त्वरित पहुंच प्राप्त करने के लिए 'लुक अप टेबल' है। जब ज़ोंबी को डिफ्रेंसिंग से बचने के लिए, एनएसएआरएआरई (जिसे हटाया जाता है) से ऑब्जेक्ट हटाते हैं तो तालिका प्रविष्टियों को सही रूप से NULL में अपडेट किया जाता है। –

+2

मैं अभी भी इसे एक अलग फ़ाइल में फैक्टरिंग करने की सलाह दूंगा और उस फ़ाइल के लिए एआरसी अक्षम कर दूंगा, क्योंकि यह एक भविष्य का सबूत समाधान है। यदि ऐप्पल ने कभी भी अर्थशास्त्र को बदलने का फैसला किया है तो आप स्केची के लिए संकलन त्रुटियों के साथ समाप्त नहीं होंगे। आपका समाधान हालांकि काम करेगा। –