2009-07-07 17 views
5

ठीक है तो मेरे पास दो स्कोप बटन के साथ एक UIViewTable और UISearchBar है। विचार यह है कि जब मैं एक स्कोप बटन दबाता हूं तो UIViewTable के लिए डेटासोर्स बदल जाता है लेकिन मुझे EXC_BAD_ACCESS त्रुटि मिल रही है।आईएसएम EXC_BAD_ACCESS एनएसएमयूटेबलएरे

मैं मेरे UIViewController SearchViewController.m में निम्न कोड:

- (void)searchBar:(UISearchBar *)searchBar selectedScopeButtonIndexDidChange: (NSInteger) selected scope 
{ 
    MyAppDelegate *delegate = (MyAppDelegate *) [[UIApplicationsharedApplication] delegate]; 
    if (self.listData != nil) { 
     [self.listData release]; 
    } 
    if (selectedScope == 0) { 
     self.listData = [delegate.data getListOne]; 
    } 
    else { 
     self.listData = [delegate.data getListTwo]; 
    } 
} 

- (void) viewDidLoad { 
    MyAppDelegate *delegate = (MyAppDelegate*) [[UIApplication sharedApplication] delegate]; 
    self.listData = [delegate.data getListOne]; 

    //some other unrelated code 
} 
मेरी SearchViewController.h में

मेरे पास है:

@property (nonatomic,retain) NSMutableArray *listData; 
मेरी Data.m में

मेरे पास है:

-(NSMutableArray *) getListOne { 
    NSMutableArray *list = [[NSMutableArray alloc] initWithObjects:@"test1", 
                    @"test2", 
                    nil]; 
    [list autorelease]; 
    return list; 
} 

-(NSMutableArray *) getListTwo { 
    NSMutableArray *list = [[NSMutableArray alloc] initWithObjects:@"test3", 
                    @"test4", 
                    nil]; 
    [list autorelease]; 
    return list; 
} 

यह क्रैश पर:

self.listData = [delegate.data getListTwo]; 

मैंने जांच की कि जब मैं उस संपत्ति को स्थापित कर रहा हूं जो इसे दुर्घटनाग्रस्त करता है। मेरी समझ यह है कि जब मैं डेटा में नया एनएसएमयूटेबलएरे बनाता हूं। मैं इसे ऑटोरेलीज़ असाइन करता हूं जैसा मुझे करना चाहिए।

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

जब मैं डेटा स्रोत को बदलने के लिए बटन दबाता हूं तो मैं यह भी जांचता हूं कि सूचीडेटा मौजूद है (जो हमेशा यह होगा), इसे छोड़ दें ताकि पुराना एनएसएमयूटेबलएरे काउंटर 0 होगा (माना जाता है कि ऑटोरेलीज हुआ है)।

तब मुझे एक नया एनएसएमयूटेबलएरे मिलता है और इसे इस संपत्ति पर सेट करता है ... क्या मेरी समझ सही है? मैंने इस साधारण समस्या पर बहुत लंबा समय बिताया है :(

ओह भी मैंने एक और एनएसएमयूटेबलएरे बनाया जो तालिका से कनेक्ट नहीं था और अभी भी वही समस्या है, अगर मैं इसे अपने कथन में रिलीज़ नहीं करता हूं, समस्या मौजूद नहीं है, लेकिन मैं तो एक स्मृति रिसाव होगा ?? मैं हमेशा बस सरणी रखने के लिए और निकाल सकते/वस्तुओं को जोड़ने, लेकिन मुझे पता है कि क्यों इस :) चियर्स

+0

बस स्टाइल टिप के रूप में, आप कुछ तरीकों से अपने तरीकों को प्राप्त कर सकते हैं ListOne/getListTwo। उदाहरण के लिए, आप प्रत्येक की पिछली 2 पंक्तियों को वापस लौट सकते हैं [सूची autorelease]। आप + alloc और -initWithObjecs के बजाय + arrayWithObjects के साथ उत्पन्न एक ऑटोरेलेज्ड सरणी लौटकर इसे एक पंक्ति में जोड़ सकते हैं: - इसका मतलब एक ही बात है लेकिन थोड़ा छोटा है। :-) –

उत्तर

7

काम नहीं कर रहा है, तो यह आपकी समस्या है चाहता हूँ:

if (self.listData !=nil) 
{ 
    [self.listData release]; 
} 

आपको इस चेक को करने की आवश्यकता नहीं है - इस तथ्य के आधार पर कि आपनेघोषित किया है retain संपत्ति के साथ 210 संपत्ति, संश्लेषित सेटर स्वचालित रूप से पुराने मूल्य में release का ख्याल रखता है।

- (void) setListData:(NSMutableArray *)listData 
{ 
    [listData retain]; 
    [self->listData release]; 
    self->listData = listData; 
} 

नोट यहाँ कुछ चीजें: संश्लेषित सेटर कुछ इस तरह दिखेगा वर्ष मूल्य जारी किया गया है, और नए मूल्य को बनाए रखा है। इसके अलावा, स्व-असाइनमेंट के मामले में रिलीज रिलीज से पहले होता है: यदि आप एक ही मान असाइन करते हैं, तो आप इसे समय-समय पर डिलीकेट नहीं करना चाहते हैं। यह भी ध्यान रखें कि यदि नया या पुराना मान nil है, तो कुछ भी बुरा नहीं होता है, क्योंकि उद्देश्य-सी स्पष्ट रूप से nil पर संदेश भेजने की अनुमति देता है, इसका कोई प्रभाव नहीं पड़ता है।

तो, इसका मतलब है कि जब भी आप संपत्ति सेट करते हैं, तो आपको पुराने मूल्य को जारी करने की चिंता करने की आवश्यकता नहीं होती है - सेटटर आपके लिए करता है। चूंकि आप एक अतिरिक्त रिलीज कर रहे हैं, इसलिए आप वास्तव में इसका उपयोग करने से पहले ऑब्जेक्ट को हटा दिया जा रहा है, इसलिए जैसे ही आप इसे हटाए जाने के बाद इसका उपयोग करते हैं, आपको EXC_BAD_ACCESS मिल जाता है।

+0

+1 - आप कोड के उस ब्लॉक को पूरी तरह से हटा सकते हैं, क्योंकि आप स्वयं यासूची शाखा में self.listData सेट कर रहे हैं। पूछने वाले को: इस समय छेड़छाड़ करने के दौरान निराश न हों; यह एक ईमानदार गलती है और एक अच्छा सीखने का अनुभव है। हर कोई इस तरह कुछ ऐसा करता है, और समझता है कि संश्लेषित गुण कैसे काम करते हैं, कभी-कभी मुश्किल हो सकता है। :-) –

+0

आह हाँ अब मैं देखता हूं =) मुझे नहीं पता था कि सिंथेसाइज्ड सेटर दृश्यों के पीछे क्या कर रहा था। चीयर्स गायस! – Allan

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