2013-10-25 9 views
7

के माध्यम से एक NSArray डिकोडिंग मैं यह पता लगाने की क्यों इस वर्ग की डिकोडिंग असफल रहा था की कोशिश कर दीवार के खिलाफ मेरे सिर पीटने सभी दोपहर बिताया। कक्षा में ऐसी संपत्ति है जो फू ऑब्जेक्ट्स का एनएसएआरएआरई है। Foo NSSecureCoding के अनुरूप है, और मैंने सफलतापूर्वक उस कक्षा को सफलतापूर्वक एन्कोड किया है और डीकोड किया है। मुझे initWithCoder में एक त्रुटि मिल रही थी: जो कक्षा Foo को डीकोड करने में विफल रहा। कुछ प्रयोगों के माध्यम से, मैंने पाया कि मुझे [Foo क्लास] को initWithCoder में जोड़ने की आवश्यकता है: इसे काम करने के लिए। शायद यह किसी और की मदद करेगा जिसकी एक ही समस्या है। मेरा सवाल है, यह क्यों जरूरी है? मुझे कोई सुझाव नहीं मिला कि यह एप्पल के दस्तावेज में आवश्यक है।अजीब behavoir जब NSSecureCoding

#import "Foo.h" 

@interface MyClass : NSObject <NSSecureCoding> 
@property (nonatomic) NSArray *bunchOfFoos; 
@end 

@implementation MyClass 

static NSString *kKeyFoo = @"kKeyFoo"; 

+ (BOOL) supportsSecureCoding 
{ 
    return YES; 
} 

- (void) encodeWithCoder:(NSCoder *)encoder 
{ 
    [encoder encodeObject:self.bunchOfFoos forKey:kKeyFoo]; 
} 

- (id) initWithCoder:(NSCoder *)decoder 
{ 
    if (self = [super init]) 
    { 
     [Foo class]; // Without this, decoding fails 
     _bunchOfFoos = [decoder decodeObjectOfClass:[NSArray class] forKey:kKeyFoo]; 
    } 
    return self; 
} 

@end 
+0

मुझे लगता है कि आप क्या हासिल करने की कोशिश कर रहे हैं के लिए आप एन्कोडिंग/लागू करने के लिए फू कक्षा में डिकोडिंग की जरूरत है। – zaph

+0

हां, मैंने कहा कि फू NSSecureCoding के अनुरूप है, जिसका मतलब है कि उस वर्ग में एन्कोडिंग/डिकोडिंग लागू किया गया है। –

उत्तर

2

मुझे लगता है कि मैंने इसे समझ लिया होगा। लाइन [फू क्लास] के बिना, इस फ़ाइल में कक्षा Foo का कोई संदर्भ नहीं है। इस वजह से, मेरा मानना ​​है कि संकलक फू क्लास आउट को अनुकूलित कर रहा है, और उसके बाद फू ऑब्जेक्ट को सरणी में डीकोड नहीं किया जा सकता है। वहां [फू वर्ग] होने से यह रोकता है। @Ben एच का समाधान मेरी समस्या का समाधान नहीं:

3
जो लोग अभी भी इस के साथ संघर्ष कर रहे हैं के लिए

। न आया हुआ अपवाद 'NSInvalidUnarchiveOperationException', कारण की वजह से

समाप्त एप्लिकेशन:: और मैं निम्न त्रुटि संदेश हो रही रखना NS.objects> 'कुंजी का मान' ClassA '' अप्रत्याशित वर्ग की थी '। की अनुमति वर्ग हैं '{(
NSArray
)}'। '

और अंत में, मुझे एहसास हुआ कि कस्टम कक्षाओं के लिए। इसके बजाय आप decodeObjectOfClasses निम्नलिखित समारोह का उपयोग करने के:

- (id)decodeObjectOfClasses:(NSSet *)classes forKey:(NSString *)key 

और तुम ऊपर कार्य करने के लिए NSArray में हर संभव कक्षाओं का एक NSSet पारित करने के लिए! मुझे यकीन है कि क्यों @Ben एच बस समारोह की एक [Foo class] बाहर जोड़कर इस मुद्दे को हल कर सकता है नहीं कर रहा हूँ। शायद यह एक संकलक मुद्दा है। लेकिन वैसे भी, अगर उसका समाधान काम नहीं करता है, तो इसे भी आजमाएं।

+1

यह मेरे लिए काम किया। – Gomfucius

+0

@Gomfucius यह जानकर खुशी हुई कि यह –

+0

धन्यवाद! यह काम। –

3

मैं सिर्फ वही समस्या का सामना किया है और कहा कि अजीब और बहुत समय लगता था। मैं Specta/Expecta के साथ सही ढंग से NSSecure कोडित होने के लिए अपनी कक्षा का परीक्षण करना चाहता था। तो मैंने डीकोड किए जाने पर आवश्यक निर्दिष्ट वर्ग के रूप में सब कुछ लागू किया है।

value for key 'key' was of unexpected class 'MyClass'. Allowed classes are '{(
    MyClass 
)}'. 

टेस्ट ऐसा ही कुछ देखा:

MyClass *myClassInstance = ... 
NSMutableData *data = [NSMutableData data]; 
NSKeyedArchiver *secureEncoder = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 
[secureEncoder setRequiresSecureCoding:YES]; // just to ensure things 

NSString *key = @"key"; 
[secureEncoder encodeObject:myClassInstance forKey:key]; 
[secureEncoder finishEncoding]; 

NSKeyedUnarchiver *secureDecoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; 
[secureDecoder setRequiresSecureCoding:YES]; 
MyClass *decodedInstance = [secureDecoder decodeObjectOfClass:[MyClass class] forKey:key]; // exception here 
[secureDecoder finishDecoding]; 

...expect... 

जबकि सादा NSCoding (requiresSecureCoding = सं) परीक्षण सफल रहा, NSSecureCoding परीक्षण में नाकाम रहने रखा मेरी परीक्षणों के अंत में मैं अजीब अपवाद मिला है। परीक्षणों के विशाल रेंज के बाद मुझे, बस एक ही लाइन है कि के लिए समाधान:

[secureDecoder setClass:[MyClass class] forClassName:NSStringFromClass([MyClass class])]; 

के बाद कि सभी मेरी परीक्षण सफल रहा, वस्तुओं बनाया गया था के रूप में उम्मीद।

मुझे यकीन नहीं है कि ऐसा क्यों हुआ, मेरा अनुमान होगा कि कक्षा Ben H के रूप में दिखाई नहीं दे रही है और यह NSClassFromString(@"MyClass") जैसे कुछ का उपयोग करता है। उपरोक्त कोड AppDelegate में ठीक काम किया। MyClass विकासशील फोड से था जो मैं विकसित कर रहा हूं।

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