2011-09-26 12 views
6

मुझे लगता है कि यह बहुत स्पष्ट है, लेकिन मेरे पास डेटा लोड करने के बारे में कोई सवाल है। यदि पुस्तकालय.dat नामक एक फ़ाइल है जो ऐप में ऑब्जेक्ट्स के बारे में सभी प्रकार की जानकारी संग्रहीत करती है। यह सभी अच्छी तरह से स्थापित है (initWithCoder और encodeWithCoder विधियों आदि के संदर्भ में), लेकिन मैं बस सोच रहा था कि क्या होता है यदि library.dat कभी दूषित हो जाता है। मैंने इसे थोड़ा सा भ्रष्ट कर दिया और ऐप फिर दुर्घटनाग्रस्त हो जाएगा। क्या दुर्घटना को रोकने का कोई तरीका है? क्या मैं इसे लोड करने से पहले एक फाइल का परीक्षण कर सकता हूं?NSKeyedUnarchiver - क्रैश को रोकने के लिए कैसे करें

-(void)loadLibraryDat { 

    NSLog(@"loadLibraryDat..."); 
    NSString *filePath = [[self documentsDirectory] stringByAppendingPathComponent:@"library.dat"]; 

    // if the app crashes here, there is no way for the user to get the app running- except by deleting and re-installing it... 
    self.libraryDat = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath]; 



} 

मैं * NSInvalidUnarchiveOperationException पर एक नज़र था, लेकिन पता नहीं कैसे मैं अपने कोड में यह लागू करना चाहिए है: यहाँ बिट जो संभवतः बहुत घातक हो सकती है है। मैं किसी भी उदाहरण के लिए आभारी रहूंगा। अग्रिम में धन्यवाद!

उत्तर

13

आप अंततः @try {} @ catch {} @ के साथ अनारक्षित कॉल को लपेट सकते हैं। यह ऐप्पल दस्तावेज़ों में यहां वर्णित है: http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/ObjectiveC/Chapters/ocExceptionHandling.html

@try { 
    self.libraryDat = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath]; 
} @catch (NSInvalidUnarchiveOperationException *ex) { 
    //do whatever you need to in case of a crash 
} @finally { 
    //this will always get called even if there is an exception 
} 
+3

उत्तर दिया है यह पुष्टि करने के लिए बहुत कुछ है कि यह इसे संभालने का आधिकारिक तरीका है। –

+1

NSInvalidUnarchiveOperationException एक स्ट्रिंग है, अपवाद की कक्षा नहीं। तो मुझे लगता है कि आपको एनएसईएक्सप्शन पकड़ना है, फिर उसके नाम के खिलाफ जांच करें ...? –

4

क्या आपने ब्लॉक को 'कोशिश/पकड़ने' की कोशिश की है? कुछ ऐसा:

@try { 
    self.libraryDat = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath]; 
} 
@catch (NSException* exception) { 
    NSLog(@"provide some logs here"); 
    // delete corrupted archive 
    // initialize libraryDat from scratch 
} 
+0

धन्यवाद! मैं इसके लिए बिल्कुल नया हूं और लोगों ने हमेशा 'कोशिश/पकड़' ब्लॉक के खिलाफ चेतावनी दी। हालांकि, इस मामले में बहुत उचित लगता है। मुझे लगता है कि ब्लॉक के साथ काम करने के अलावा कोई दूसरा रास्ता नहीं है, है ना? –

+1

मुझे लगता है कि कोई अन्य सरल समाधान नहीं है। दुर्भाग्य से। – igoris

+0

बस कोशिश की, लेकिन एक्सकोड ने मुझे बताया कि "अज्ञात प्रकार का नाम 'एनएसआईएनवालिड अनारक्षित ओपेरेशन अपवाद' - क्या मुझे पहले इसे परिभाषित करना है? –

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

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