2011-01-12 1 views
5

実際のパスワードの代わりにクラスインスタンス変数としてmd5文字列を保存しようとしています。私は実際のパスワードの代わりにインスタンス変数に格納しようとしているmd5文字列を返す静的関数を持っています。Objective-C静的メソッドの結果がクラスインスタンス変数に保存され、使用時に "EXC_BAD_ACCESS"と表示されます

私は私のクラスのインスタンス変数のために、以下のセッターを持っている:

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

は、これは正しいMD5文字列を返すため、私のinit関数内のパスワード変数に保存します:[自己のsetPassword:pword] ;.私は別のインスタンスメソッドを呼び出すとself.passwordにアクセスしようとした場合

『EXC_BAD_ACCESS」を私は得るでしょう』。

を私はメモリを解放なっていることを理解し、私はそれがとどまることを確認するには見当もつかない。

私は運と自動解放とのallocのinitを試してみました

をこれが初期化(丁重に別のstackoverflowの質問で見つかった)中に呼び出さなっmd5HexDigest機能です。

+ (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; 
} 

ヘルプ/ポインターは大変ありがとうございます。私はむしろ、パスワードを使用する必要があるたびにmd5を呼び出す実際のパスワードよりもメモリにmd5の文字列を保存したいと思います。

ありがとうございます。

+0

あなたはあなたのインターフェイスの内容を投稿することができますか? – Alex

+0

あなたが持っているオブジェクトが自動リリースされているという問題はありませんか? [ret retainCount] [password retainCount] –

+3

いいえ、retainCountを呼び出さないでください。 – pwc

答えて

3

Davidとpwcはどちらも正しいですが、重要な詳細がありません。

setPassword: should copy inboundパラメータ。これは、他の回答が意味するものではありませんし、また、その

  • セットの文字列は、もはや変更可能であるとして、それは適切にretain編です

    • ことが保証されます両方。

    すなわち、のようなもの:

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

    あなたはエスパリングチャンピオンのメイトです。 – Art

    2

    あなたのセッターはretainに新しい値([utils md5HexDigest:newpass]から返されたもの)が必要です。 newpassが実際のパスワードですが、passwordはMD5ダイジェストです:

    はまた、テストif(newpass != password)はどんな意味がない(と...古い値すぎreleaseすることを忘れないでください)。

    +0

    ビンゴ!今日は何か新しいことを学び、そのトリックを維持しています。私がそこにあった条件を捕まえてくれてありがとう。ありがとう、トン! – KinGBin

    2

    md5HexDigestによって返されるNSStringは、自動解放されます(NSMutableString stringWithCapacityは自動解放された文字列を返します)。 setPasswordにそれを保持する必要があります。それ以外の場合は、自動解放プールによって解放されています。

    関連する問題