ठीक है तो मेरे पास दो स्कोप बटन के साथ एक 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 होगा (माना जाता है कि ऑटोरेलीज हुआ है)।
तब मुझे एक नया एनएसएमयूटेबलएरे मिलता है और इसे इस संपत्ति पर सेट करता है ... क्या मेरी समझ सही है? मैंने इस साधारण समस्या पर बहुत लंबा समय बिताया है :(
ओह भी मैंने एक और एनएसएमयूटेबलएरे बनाया जो तालिका से कनेक्ट नहीं था और अभी भी वही समस्या है, अगर मैं इसे अपने कथन में रिलीज़ नहीं करता हूं, समस्या मौजूद नहीं है, लेकिन मैं तो एक स्मृति रिसाव होगा ?? मैं हमेशा बस सरणी रखने के लिए और निकाल सकते/वस्तुओं को जोड़ने, लेकिन मुझे पता है कि क्यों इस :) चियर्स
बस स्टाइल टिप के रूप में, आप कुछ तरीकों से अपने तरीकों को प्राप्त कर सकते हैं ListOne/getListTwo। उदाहरण के लिए, आप प्रत्येक की पिछली 2 पंक्तियों को वापस लौट सकते हैं [सूची autorelease]। आप + alloc और -initWithObjecs के बजाय + arrayWithObjects के साथ उत्पन्न एक ऑटोरेलेज्ड सरणी लौटकर इसे एक पंक्ति में जोड़ सकते हैं: - इसका मतलब एक ही बात है लेकिन थोड़ा छोटा है। :-) –