2011-01-12 7 views
5

का उपयोग करते समय "EXC_BAD_ACCESS" दिया जाता है, तो मैं md5 स्ट्रिंग को वास्तविक पासवर्ड के बजाय क्लास इंस्टेंस वैरिएबल के रूप में स्टोर करने का प्रयास कर रहा हूं। मेरे पास एक स्थिर फ़ंक्शन है जो एक md5 स्ट्रिंग लौटाएगा जिसे मैं वास्तविक पासवर्ड की बजाय इंस्टेंस वैरिएबल में स्टोर करने का प्रयास कर रहा हूं।उद्देश्य-सी परिणाम क्लास इंस्टेंस वैरिएबल में सहेजा गया है जब

मैं मेरी कक्षा उदाहरण चर के लिए निम्नलिखित सेटर:

-(void)setPassword:(NSString *)newpass{ 
if(newpass != password){ 
    password = [utils md5HexDigest:newpass]; 
} 
} 

यह सही md5 स्ट्रिंग वापस गुजरती हैं और मेरी init समारोह में पासवर्ड चर करने के लिए इसे बचाने के लिए होगा: [आत्म setPassword: pword] ;.

अगर मैं एक और उदाहरण विधि कॉल और self.password तक पहुँचने का प्रयास EXC_BAD_ACCESS "" मैं मिल जाएगा "।

मैं समझता हूँ कि स्मृति जारी किया जा रहा है, लेकिन मुझे यकीन है कि यह रहता है कोई सुराग नहीं है।

मैं कोई भाग्य के साथ autorelease साथ alloc init की कोशिश की है

यह md5HexDigest समारोह init (कृपा एक और stackoverflow प्रश्न में पाया जाता है) के दौरान बुलाया जा रहा है:।

+ (NSString*)md5HexDigest:(NSString*)input { 
    const char* str = [input UTF8String]; 
    unsigned char result[CC_MD5_DIGEST_LENGTH]; 
    CC_MD5(str, strlen(str), result); 

    NSMutableString *ret = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH*2]; 

    for(int i = 0; i<CC_MD5_DIGEST_LENGTH; i++) 
    [ret appendFormat:@"%02x",result[i]]; 

    return ret; 
} 

किसी भी मदद/पॉइंटर्स की सराहना की जाएगी। एमडी 5 स्ट्रिंग को एमडी 5 को कॉल करने वाले वास्तविक पासवर्ड की तुलना में स्मृति में सहेजा गया होगा, जब भी मुझे पासवर्ड का उपयोग करने की आवश्यकता होती है।

अग्रिम धन्यवाद।

+0

आप अपने इंटरफेस की सामग्री को पोस्ट कर सकते हैं? – Alex

+0

क्या समस्या नहीं है कि आपके पास ऑब्जेक्ट है जो स्वत: है? डीबग [ret retainCount] [पासवर्ड retainCount] के लिए teh कंसोल के retaincount प्रिंट करने का प्रयास करें [पासवर्ड retainCount] –

+3

नहीं, retainCount पर कॉल न करें। – pwc

उत्तर

3

डेविड और पीडब्ल्यूसी दोनों सही हैं, लेकिन एक महत्वपूर्ण जानकारी याद आ रही है।

setPassword:copy इनबाउंड पैरामीटर होना चाहिए। यह दोनों यह सुनिश्चित करेंगे कि

  • यह retain एड ठीक से है के रूप में अन्य उत्तर दिखाते हैं और यह भी कहा कि
  • सेट स्ट्रिंग नहीं रह गया है परिवर्तनशील है।

अर्थात कुछ की तरह:

-(void)setPassword:(NSString *)newpass{ 
    [password release]; 
    password = [[utils md5HexDigest: newpass] copy]; 
} 
+0

आप एक प्रभावशाली चैंपियन साथी हैं। – Art

2

आपके सेटर को retain नया मान ([utils md5HexDigest:newpass] से लौटाया गया) की आवश्यकता है। (और release करने के लिए पुराने मूल्य भी भूल नहीं ...)

इसके अलावा, परीक्षण if(newpass != password) किसी भी मतलब नहीं है: newpass एक वास्तविक पासवर्ड है, लेकिन password md5 डाइजेस्ट है।

+0

बिंगो! आज कुछ नया सीख लिया, चाल चलाना जारी रखा। वहां सशर्त को पकड़ने के लिए धन्यवाद। अनेक अनेक धन्यवाद! – KinGBin

2

एनएसएसटींग md5HexDigest द्वारा लौटाया गया है ऑटोरेलेज्ड (क्योंकि NSMutableString stringWithCapacity एक ऑटोरेलेज्ड स्ट्रिंग देता है)। आपको setPassword में इसे बनाए रखने की आवश्यकता है। अन्यथा, इसे ऑटोरेलीज पूल द्वारा मुक्त किया जा रहा है।