2012-01-04 11 views
1

[OK]を、私はそれと戦って最後の8時間を費やした - それはちょうど私の外に思われる。オブジェクトの割り当てが解除されます - なぜですか?どこ?

- (void)updateUserDefaults 
{ 
    NSMutableDictionary *viewControllerDetails = [[NSMutableDictionary alloc] initWithCapacity:4]; 

    [viewControllerDetails setObject:[NSNumber numberWithInt:OOVenueClassControllerType] forKey:@"classType"]; 
    [viewControllerDetails setObject:self.searchTerm forKey:@"searchTerm"]; 
    [viewControllerDetails setObject:self.searchLocation forKey:@"searchLocation"]; 

    //----- the next two lines cause the problem 
    NSString *res = [[NSString stringWithFormat:@"%@",[searchResults xmlString]] retain]; 
    [viewControllerDetails setObject:res forKey:@"searchresults"]; 
    //----- 

    NSMutableArray *viewControllersList = [NSMutableArray array] ; 
    [viewControllersList addObject:viewControllerDetails]; 

    NSUserDefaults *defs = [NSUserDefaults standardUserDefaults]; 
    //the following line causes the error 
    [defs setObject:viewControllersList forKey:kViewControllersKey]; 
    [defs synchronize]; 

    [res release]; 
} 

the next two lines cause the problemとブロック:ここに私の完全な(関連)のコードです。最初は別の文字列を作成しませんでしたが、問題を解決しようとしている間に後で追加しました。

これらの2行をコメントアウトすると、すべて正常に動作します。私は背中に入れた場合、私は

- [CFString class]: message sent to deallocated instance 0xa1a9000 

を得る何かが私はuserdefaultsに入れしようとしている文字列が間違っていますか?その文字列はかなり大きい(約200,000文字)が、私は過去のユーザーデフォルトでさらに長い文字列を格納していました。

アプリをアンインストールすると、すべて正常に機能することにも注意してください。しかし、それ以降の実行では、問題が発生します。

だから、どのように、なぜ、どこで文字列が割り当て解除されるのですか?私は明示的にretainを追加しましたが、それでも助けにはなりません。私は何が欠けていますか?

編集:だけ実現私はエラーがライン上

[defs setObject:viewControllersList forKey:kViewControllersKey]; 

を投げていると言うのを忘れても、一般的な情報については、searchResultsの方法- (NSString *)xmlStringは、名前の意味を正確に何を行いますとXML文字列を作成しますそのオブジェクトからの情報

編集2:私はその文字列に何かをやってみました - zlibのを使用して圧縮し、NSDataに変換 - しかし、データ型に関係なく、その特定のオブジェクトの割り当てが解除されます。それは文字列のサイズで何かする必要がありますか?

+0

問題は「[searchResults xmlString]」だと思われますが、これはコードのどこにも表示されません。それを使用する他のコードを表示できますか? – Louis

+0

@ルイス:いくつかの追加情報で質問を更新しました –

+1

'kViewControllersKey'はどのように定義されていますか? – Joe

答えて

0

[OK]をクリックすると、問題が正確にはわかりませんが、searchResultsおよび/またはxmlStringメソッドのどこかにありました。 searchResultsオブジェクトは、元々はサーバーから受信したXMLから作成されます(XMLはオブジェクト構造に解析されます)。 xmlStringが呼び出されたとき、何らかの理由で私が元に戻っていた文字列が元のXMLとは異なっていました(私はもちろん、フォーマットについては話しません) - 最初の500文字以内に200,000文字の文字列があります。違い。私は理由を理解することができませんでした。したがって、オブジェクト構造からxmlを再作成する代わりに、元のXMLをそのオブジェクトのフィールドに格納し、xmlStringが呼び出されたときに元の文字列を返すだけでした。今はすべてうまくいった。

この苦しいプロセスを通して、皆さんのご支援をありがとうございます。

1
NSString *res = [[NSString stringWithFormat:@"%@",[searchResults xmlString]] retain]; 

自動リリースされました。あなたはメソッドの終わりにそれを解放する必要はありません。あなたはそれを過剰にリリースしています。

さらに、[searchResults xmlString]を保持する必要はありません。 stringWithFormatメソッドは既にあなたのためにそれを行います。

Good Luck!

+0

あなたのコメントをお寄せいただきありがとうございますが、実行は決してその行に到達しないため、間違いなく問題ありません。このエラーは、 '[defs setObject:viewControllersList forKey:kViewControllersKey];行にスローされます。 ' –

+0

' res'が保持され、後で解放されるので、それは過剰解放ではありません。 – tia

+0

@tia、すてきなキャッチ – timthetoolman

関連する問題