2009-03-11 21 views
7

देता है मुझे यकीन है कि मैं कुछ मूर्खतापूर्ण कर रहा हूं, लेकिन यह मुझे पागल कर रहा है।एनएसएमयूटेबलएरे काउंटर हमेशा शून्य

मैं डेटाबेस परिणामों के माध्यम से लूप करने की कोशिश कर रहा हूं, उन परिणामों से ऑब्जेक्ट्स बना सकता हूं, और ऑब्जेक्ट्स को एनएसएमयूटेबलएरे में जोड़ सकता हूं। मैं यह सत्यापित किए जाने के माध्यम से NSLog कॉल डेटा सही ढंग से डेटाबेस से पढ़ने की जा रही है और वस्तु को कॉपी किया है, लेकिन NSMutableArray हमेशा रिटर्न 0.

यहाँ के लिए गिनती कोड का सार है:

while ([rs next]) { 

    Kana *htemp = [Kana alloc]; 

    htemp.content = [rs stringForColumn:@"hiragana"]; 
    [hiragana addObject:htemp]; 

} 
NSLog(@"Hiragana contains %d objects", [hiragana count]); 

काना एनएसओब्जेक्ट से लिया गया है, और हिरागाना एनएसएमयूटेबलएरे का एक उदाहरण है।

मुझे यकीन है कि यह एक रूकी गलती है, और मुझे उम्मीद है कि कोई मुझे सीधे सेट कर सकता है। TIA! :)

उत्तर

39

मेरा अनुमान है कि आपके द्वारा पोस्ट किए गए कोड से निर्णय लेना, यह है कि आप शायद अपनी सरणी को ठीक से आवंटित नहीं कर रहे हैं। वस्तुओं को बनाते समय, आपको उन्हें भी आरंभ करना होगा। इसलिए, इस:

Kana *htemp = [Kana alloc]; 

होना चाहिए:

Kata *temp = [[Kana alloc] init]; 

सभी वस्तुओं इस तरह से प्रारंभ करने की आवश्यकता है।

NSMutableArray *hiragana = [NSMutableArray alloc]; 

यह करने के लिए:

NSMutableArray *hiragana = [[NSMutableArray alloc] init]; 

अनुकूलन कारणों के लिए, आप शायद चाहिए इस प्रकार, यदि मैं सही हूँ और आप अपने सरणी आरंभ नहीं किया है, तो अपनी रचना इस से जाने की जरूरत है

[[NSMutableArray alloc] initWithCapacity:someNumber]; 
+0

आपका उत्तर अच्छा है - आपको सरणी में जोड़ने के बाद htemp ऑब्जेक्ट को रिलीज़ करने के लिए नीचे उल्लिखित सलाह भी शामिल करनी चाहिए, अन्यथा यह एक बड़ी मेमोरी लीक है। – danielpunkass

+0

इस प्रश्न और उत्तर के लिए धन्यवाद ... यह मेरी मदद करता है! (N_n) –

0

कुछ बातें:

  1. यदि आप जबकि पाश के अंदर एक NSLog कॉल डाल क्या होता है? सत्यापित करें कि लूप पुनरावृत्तियों वास्तव में सरणी पर दोष लगाने से पहले हो रहा है।
  2. आप सरणी हिरागाना कहां बना रहे हैं? यदि आप किसी कारण से गलत तरीके से कर रहे हैं और सरणी शून्य है, तो इससे इस तरह की समस्याएं हो सकती हैं।
  3. यदि आपके पास कचरा संग्रह नहीं है, तो इसे लूप में जोड़ने के बाद [htemp रिलीज] करना सुनिश्चित करें। addObject बरकरार रखता है और प्रत्येक जोड़ा आइटम लूप से रिसाव होगा। फिर, कचरा संग्रह बंद होने पर यह केवल प्रासंगिक है।

यह संभव है कि आप सरणी को सही तरीके से नहीं बनाया गया है या आरएस में जो भी शामिल है, उसमें शामिल नहीं है, और इसलिए [आरएस अगली] कभी भी नहीं बुलाया जा रहा है (यदि आरएस शून्य है, उदाहरण के लिए, इस लूप का कोई पुनरावृत्ति निष्पादित नहीं होगा और आपको कोई त्रुटि नहीं होगी)।

+0

आह हो जाएगा ... यह बुरा सरणी प्रारंभ FTW था! :) धन्यवाद! –

2

एक अन्य आम कारण (, के रूप में यह पता चला है आपके मामले में नहीं है, लेकिन gener: भी आरंभिक क्षमता के साथ-साथ यदि आपके पास किसी भी विचार को निर्दिष्ट आप कैसे कई वस्तुओं पैदा हो सकती हैं सहयोगी) सरणी आवंटित करने के लिए भी भूल रहा है। यदि आपने अभी तक एक सरणी नहीं बनाया है, तो आप उस count संदेश nil को भेज रहे हैं, तो परिणाम हमेशा 0.

संबंधित मुद्दे