2010-04-29 18 views
5

मेरा UITableView EXEC_BAD_ACCESS लौटा रहा है, लेकिन क्यों!UITableView सेल में EXEC_BAD_ACCESS सेलफोररएट इंडेक्सपैथ

इस कोड को स्निपेट देखें!

UITableView लोड हो रहा है ठीक है, तो allXYZArray != nil और आबादी है!

फिर नीचे करने के लिए tableview स्क्रॉल और कारणों यह दुर्घटना का बैक अप, के रूप में यह विधि cellForRowAtIndexPath

यह लाइन पर विफल रहता है फिर से लोड करने चला जाता है:

"NSLog(@"allXYZArray::count: %i", [allXYZArray count]);" 

     (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAt 

IndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"CellIdentifier"; 
UITableViewCell *cell = [theTableView dequeueReusableCellWithIdentifier:CellIdentifier]; 


cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
@try 
{ 
if (allXYZArray == nil) { 
    NSLog(@"nil"); 
    allXYZArray = [ToolBox getMergedSortedDictionaries:allXYZGiven SecondDictionary:allXYZSought]; 
} 
NSLog(@"%i", [indexPath row]); 
NSLog(@"allXYZArray::count: %i", [allXYZArray count]); 
+0

क्या आप बाकी विधि के लिए कोड पोस्ट कर सकते हैं [ToolBox getMergedSortedDaries: SecondDictionary:] के लिए कोड? – MrHen

उत्तर

10

EXC_BAD_ACCESS मतलब है कि आपके कार्यक्रम एक स्मृति पता है कि अवैध या अन्यथा आपकी प्रक्रिया से दुर्गम है का उपयोग करने की कोशिश कर रहा है। यह आमतौर पर तब होता है जब आप उस ऑब्जेक्ट को संदेश भेजने का प्रयास करते हैं जिसे पहले से ही हटा दिया गया है। तो EXC_BAD_ACCESS को डिबग करने का पहला चरण यह पता लगाने के लिए है कि आपका प्रोग्राम किस दुर्घटनाग्रस्त होने पर संदेश भेजने का प्रयास कर रहा था। अक्सर उत्तर स्पष्ट नहीं है, इस मामले में, NSZombieEnabled कोड की कौन सी रेखा को दुर्घटनाग्रस्त होने की पहचान करने के लिए एक शानदार उपकरण है।

आपके मामले में आप पहले ही निर्धारित कर चुके हैं कि क्रैश तब होता है जब आप [allXYZArray count] पर कॉल करते हैं, जिससे allXYZArray हमारे प्रमुख संदिग्ध होते हैं। यह ऑब्जेक्ट +[ToolBox getMergedSortedDictionaries:SecondDictionary:] से वापस किया जा रहा है, इसलिए यह संभावना है कि आपकी बग उस विधि के कार्यान्वयन में है। मुझे लगता है कि यह एक ऐसी वस्तु को वापस कर रहा है जिसे Memory Management Programming Guide for Cocoa द्वारा निर्धारित अनुसार ऑटोमोलेज्ड के बजाए पहले ही रिलीज़ किया जा चुका है। (यह एसडीके में सबसे महत्वपूर्ण दस्तावेजों में से एक है, वैसे भी। मैं महीने में एक बार इसे फिर से पढ़ाने की सलाह देता हूं जब तक उसकी नीतियां और तकनीक दूसरी प्रकृति नहीं बन जाती।)

1

ठीक है, एक सेल पुन: उपयोग करता है, नहीं गारंटी है कि सेल ठीक से प्रारंभ किया जाएगा:

UITableViewCell *cell = [theTableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

सेल कभी कभी अशक्त हो जाएगा (विशेष रूप से पहली बार मुझे लगता है कि)।

शून्य के लिए सेल जांचें और यदि ऐसा है, तो इसे ठीक से प्रारंभ करें।

if (cell == nil) 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
संबंधित मुद्दे