मैं अपने * ज फ़ाइल में मेरी सरणी की घोषणा:सही तरीका घोषित करने के लिए, alloc, लोड, और dealloc एक NSMutableArray
@interface aViewController: UIViewController { NSMutableArray *anArray; // You will need to later change this many times. } @end
मैं इसके लिए स्मृति alloc मेरी * .m फ़ाइल:
-(void) viewDidLoad { anArray = [[NSMutableArray alloc] init]; }
मैं एक परीक्षण बटन पर क्लिक करें मेरी सरणी लोड करने के लिए (अंततः इसे प्रत्येक क्लिक पर differnt मूल्यों लोड करने के लिए की आवश्यकता होगी):
anArray = [NSMutableArray arrayWithObjects:@"one", @"two", @"three", nil];
और मैं इसे यहां मुक्त करता हूं:
-(void) dealloc { [anArray release]; [super dealloc]; }
क्या यह सब ठीक दिखता है?
यह दुर्घटनाओं क्योंकि जब मैं बाद में इस कोड चलाएँ:
NSLog(@"%d", [anArray count]);
सुनिश्चित नहीं हैं कि क्यों एक साधारण "NSLog() और गिनती" सब कुछ दुर्घटना होगा।
एक प्रकार की कटार,
मुझे इसे इस तरह से रख दो: मैं संकेत दिए गए, सरणियों, स्ट्रिंग्स और स्मृति का एक विशाल गलतफहमी है।
मैंने जो कुछ भी पाया है उसे पढ़ा है ... लेकिन (अभी तक) एक सरल, स्पष्ट, आसानी से समझने वाला वर्णन ढूंढना है।
क्या आप एक सुझाव दे सकते हैं? (उम्मीद है कि पढ़ने के 10 से कम पेज।) क्या कोई संदर्भ है जो जस्ट इस विषय को बताता है ... और "आपके पास कोडिंग अनुभव के 12 साल हैं ... लेकिन किसी ने कभी भी स्मृति आवंटित करने के साथ निपटाया है या नहीं पॉइंटर्स "।)
तो परिवर्तनीय-नाम जिस तरह से मैं ऑब्जेक्ट को संदर्भित करता हूं? फिर यह क्यों है?
मैं कई अन्य भाषाओं कि सिर्फ यह करने के लिए इस्तेमाल किया है:
myString = "this" myString = "that" myInt = 5 myInt = 15
(सरल हो सकता है क्या।)
मेरे लिए ऐसा लगता है कि यह करने के लिए सबसे आसान तरीका होगा इस। (और यह काम करने लगता है लेकिन यह वास्तव में सही है।?)
Don't alloc any memory for my NSMutableArray initially. Don't re-alloc any memory repeatedly. (When I change my array's values.) Don't release it repeatedly. (Before I change my array's values.) Don't release it when I exit the program. But: Always remember to use RETAIN when I initially assign (and repeatedly reassign) new values to my anArray variable.
आप anArray = [NSMutableArray arrayWithObjects के साथ अपने सरणी लोड हो रहा है नहीं कर रहे हैं: @ "एक", @ "दो" , @"तीन खाली]; इसके बजाय, आप एक नया उदाहरण इसकी जगह जाता है, और भी बदतर: एक उदाहरण है, जिसका संदर्भ वास्तव में कुछ इकाई के स्वामित्व में है के साथ
वाह नियंत्रित नहीं करते। तो मेरे पास 20 सरणी हो सकती हैं ... सभी को एक ही नाम कहा जाता है: anArray ... और वे सभी अलग होंगे?(ग्लोबल सरणी जैसी कोई चीज़ नहीं है?)
आदि पुराने मानों को साफ़ करने के लिए, विधि हटाएंऑलऑब्जेक्ट आसान हो सकता है। उत्परिवर्तन विधियां भी हैं, जिनका उपयोग कई मानों को एक साथ में जोड़ने के लिए किया जा सकता है।
तो ... पहले मैं "सभी वस्तुओं को हटाने" करने के लिए है ... और फिर मैं एक विधि यह सब मेरी नए मूल्यों को फिर से जोड़ने के कॉल कर सकते हैं।
anArray = [[NSMutableArray arrayWithObjects: @ "one", @ "two", @ "three", nil] retain]; आवंटन/init अनुक्रम के बजाय ।
वाह। मैंने सोचा कि इसके लिए जगह आवंटित किए बिना किसी सरणी में कुछ भी संग्रहीत नहीं किया जा सकता है।
तुम सच में पूरे सरणी को बदलने के लिए चाहते हैं तो आपको उपयोग करने वाली प्रॉपर्टी
विचार कर सकते हैं मैं गुण का उपयोग कर कि क्या करना होगा कैसे?
> anArray = [NSMutableArray arrayWithObjects:@"one", @"two", @"three", nil]; > anArray = [NSMutableArray arrayWithObjects:@"four", @"five", @"six", nil];
वैसे ही जैसे मैं क्या करना होगा:
x = 12; x = 24;
वाह
इस तरह कुछ करने के लिए सही तरीका क्या होगा। मैं वास्तव में तारों, सरणी और स्मृति के बारे में सब कुछ पूरी तरह गलत समझता है। मैंने सोचा था कि "आसान तरीका" एक बार आवंटित किया गया था ... म्यूटेबल सरणी का उपयोग करें ... जितना चाहें उतना बदलें ... और इसे एक बार मुक्त करें।
ऐसा करने के साथ समस्या यह है कि इस नए सरणी बनाए रखा नहीं है,
मुझे लगता है कि होगा वर्ष सरणी चला गया हो जाएगा ... और नई सरणी में इस्तेमाल किया जा सकता है। (लेकिन मुझे लगता है नहीं।)
आगे, आपके पास मेमोरी रिसाव है क्योंकि आपने कभी भी मूल सरणी को मुक्त नहीं किया है।
मैं सोच रहा था कि पुरानी सरणी को मुक्त करने का अनुमान नहीं था ... मैं इसके साथ नहीं कर रहा हूं ... मैं बस इसे अपने नए मूल्यों को बदलने के लिए बदलना चाहता हूं। (लेकिन मुझे लगता है नहीं।)
लेकिन एक [anArray रिलीज] का उपयोग करना है;
मैं सोच रहा था कि मुझे आवंटित स्मृति को रिलीज़ करने का कारण होगा ... (लेकिन मुझे लगता है) ... और फिर मुझे और अधिक स्मृति आवंटित करना होगा। (लेकिन मुझे नहीं लगता।)
anArray = [[NSMutableArray arrayWithObjects: @ "एक", @ "दो", @ "तीन", शून्य] बनाए रखने];
तो मुझे इसे "बनाए रखना" है ... तो यह मेरे नीचे से गायब नहीं होता है? (सुनिश्चित नहीं हैं कि क्यों यह जब तक मैं यह करने के लिए ... बता होगा मेरा अंतिम dealloc कॉल में।।)
एक और, शायद और अधिक सही तरीका यह addObject उपयोग करने के लिए किया जाएगा तय करने के लिए: या addObjectsFromArray : लगातार नए सरणी बनाने के बजाय एनएसएमयूटेबलएरे तरीकों।
मैं केवल बनाने के लिए एक सरणी चाहते हैं ... और सिर्फ इसका इस्तेमाल के रूप में मैं चाहता हूँ। मैं कभी भी एडी एरे में नहीं चाहता हूं। मैं इसे अपने नए मूल्यों में सेट करना चाहता हूं।
मुझे पता है कि यह पोस्ट इंटरनेट समय में पुरानी है, लेकिन मैं यह स्पष्ट करना चाहता हूं कि कोको विकास में हम मूल रूप से वास्तव में डेटास्ट्रक्चर को मैनिपुलेट नहीं करते हैं, बल्कि उन्हें पॉइंटर्स करते हैं। इसे हर समय ध्यान में रखें, और ध्यान रखें कि आपको सूचक असाइनमेंट के साथ बहुत सावधान रहना होगा। – rwols
मेरी इच्छा है कि मैं आपको एक से अधिक वोट दे सकता हूं - मुझे वही समस्याएं आ रही हैं - उद्देश्य सी काउंटर सहज से परे है। – Jimmery