मेरे नियंत्रक delegat में फ़ंक्शन से डेटा प्राप्त करते हैं:
- (NSArray *) getChapters { NSMutableArray * list = [[NSMutableArray alloc] init]; // मेमोरी लीक अगर (अध्याय_ स्थान == नीला) {const char * sql = "चुनें भिन्न '' ग्वालवा '' अध्याय अध्याय से कहां पुस्तक =? अध्याय अध्याय"; यदि (sqlite3_prepare_v2 (डेटाबेस, sql, -1, & amp; chapter_statement, NULL)! = SQLITE_OK) {NSAssert1 (0, @ "त्रुटि: संदेश '% s' के साथ वक्तव्य तैयार करने में विफल रहा है।), Sqlite3_errmsg (डेटाबेस)); }} Sqlite3_bind_int (अध्याय_स्टेटमेंट, 1, स्व। पुस्तक); जबकि (sqlite3_step (chapter_statement) == SQLITE_ROW) {NSString * body = [NSString stringWithUTF8String: (चार *) sqlite3_column_text (अध्याय_स्टेटमेंट, 0)]; [सूची addObject: body]; [शरीर रिलीज]; } Sqlite3_reset (अध्याय_स्टेटमेंट); वापसी सूची; } और इसे नियंत्रक में उपयोग करें:
- (शून्य) दृश्यविलएपीपर: (BOOL) एनिमेटेड {AppDelegate * appDelegate = (AppDelegate *) [[UIApplication साझा आवेदक] प्रतिनिधि]; Self.listChapters = [[NSArray alloc] initWithArray: [ऐप Delegate getChapters]]; [Self.listChapters रिलीज]; } लीक इस पर एक स्मृति रिसाव दिखाता है: NSMutableArray * list = [[NSMutableArray alloc] init]; यदि मैं की तरह वापसी करता हूँ [सूची autorelease ]; एप में क्रैश हो जाता है viewWillAppear । इस समस्या को ठीक कैसे करें
रिटर्निंग [सूची autorelease] सही है करने के लिए। आपकी समस्या यह है कि [body release] जिसे आपको आवश्यकता नहीं है। - [NSString स्ट्रिंग WithUTF8String:] एक autoreleased NSString देता है स्पष्ट [शरीर रिलीज़] का अर्थ है कि सूची में वितरित ऑब्जेक्ट के लिए पॉइंटर्स हैं।
[बॉडी रिलीज़] लाइन को हटाएं और रिटर्न [सूची ऑटोरिएक्ज] वापस डालें और इसे काम करना चाहिए।
आप इस तरह अन्य स्मृति प्रबंधन समस्याओं को खोजने के लिए संकलक को पूछने के लिए स्थिर विश्लेषक (सीएमडी-शिफ्ट-ए) चला सकते हैं।
Comments
Post a Comment