के तहत ऑब्जेक्टिव-सी ऑब्जेक्ट्स के पॉइंटर्स की सी-स्टाइल सरणी मेरे पास मैप ग्रिड पर गेम ऑब्जेक्ट्स का ट्रैक रखने के लिए ऑब्जेक्टिव-सी उदाहरणों के पॉइंटर्स की 2 डी सरणी है। अब मैं अपना कोड एआरसी में बदल रहा हूं, और एक्सकोड ने त्रुटि की ओर इशारा किया। मुझे पता था कि ऑब्जेक्ट्स के पॉइंटर्स को स्ट्रक्चर सदस्यों के रूप में अनुमति नहीं है, लेकिन इसने मुझे गार्ड से लगभग (लगभग) पकड़ा।एआरसी
मैं एआरसी constrains के पीछे तर्क समझते हैं, लेकिन:
मैं उद्देश्य सी सरणियों के भूमि के ऊपर जब ग्रिड में वस्तुओं को देख बर्दाश्त नहीं कर सकते हैं, और
वस्तुओं स्वयं पहले से ही उसी श्रेणी में परिभाषित
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;
एआरसी इंगित करने वाले कोड की रेखा कहां है? –
एक्सकोड एक ही समय में सभी त्रुटियों को इंगित नहीं करता है, बल्कि इसके बजाय 4-12 के बैचों में। आप कुछ ठीक करते हैं, और अगले वाले निम्नलिखित चेक में दिखाई देते हैं। पहली त्रुटि सी-सरणी की ivar घोषणा में दिखाई दी। और अब, obj-c सूचक और शून्य * के बीच प्रत्येक असाइनमेंट या तुलना संकेत दिया जा रहा है। मैं अभी इसे ठीक कर रहा हूं, और ऐसा लगता है कि __bridge को काम करना चाहिए ... –
यह उत्सुक है, कुछ कास्ट एक्सकोड की स्वत: सुधार सुविधा द्वारा 'सुझाए गए' हैं, लेकिन कुछ को सिर्फ त्रुटियों के रूप में चिह्नित किया गया है। –