0

私はiosプログラミングの初心者なので、質問があります。私はアプリに取り組んでおり、インターネット上にデータをロードし続けます。これはページング データであるため、ユーザーが次のページに移動すると、インターネット上のページのデータがロードされます。シングルトンクラスを使用して作成しましたが、問題なく動作しますが、質問がありました-

最初のページが到着したら - のように self.posts 変数に保存しself.posts = dataA、ユーザーが次のページに移動すると、 self.posts を dataB のように変更しますself.posts = dataB。私の質問は、dataA が iOS によって自動的にリリースされるかどうかです。そうでない場合、これらのガベージメモリを処理する方法は? ページごとにデータが読み込まれることはわかっていますが、非常に多くのページが読み込まれると、問題になる可能性があります......ありがとう。

申し訳ありませんが、アプリは iOS 3.x+ 用であるため、ARC は使用できないと思います。この関数を確認してください。HTTP 接続が完了した後に呼び出され、JSON を NSDictionary に解析します。ページごとに約 5 つの投稿が読み込まれ、次のページにはさらに 5 つの投稿が読み込まれるので、self.posts が変更されます。別の新しい HTTP ネットワーキングの場合。

- (void) getNextPostsFromJson:(NSData *)data
{
    NSError *theError = nil;

    NSDictionary *dict = [[CJSONDeserializer deserializer] deserializeAsDictionary:data error:&theError];

    if (dict == nil) {
        isValidJson = NO;
        httpStatus = HTTP_STATUS_FAILED;

        NSLog(@"json con - %@ %@",
              [theError localizedDescription],
              [[theError userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]);   
    } else {

        NSArray *keys = [dict allKeys];        

        if ([keys count] >= TOTAL_SECTIONS) {
            self.posts = dict;
        } else {
            self.posts = nil;
        }

        NSLog(@"posts = %@", self.posts);
        return;
    }
}
4

3 に答える 3

0

プロパティの設定に加えて手動で dataA を保持していない限り、心配する必要はありません。ドット表記を使用すると、プロパティとして設定されたオブジェクトが保持され、他のオブジェクトに置き換えられると再び解放されます。

編集:あなたが追加したコード例は私には問題ないようです...

于 2012-05-24T12:45:01.743 に答える
0

トースターの提案は正しいです。

次のようなプロパティを使用する場合。

@property (nonatomic, retain) NSDictionary* posts;

あなたがするとき

self.posts = dataB;

古い値参照オブジェクトが解放されます。

ディレクティブを使用してコンパイラによって合成されたセッター@synthesizeは次のようになります (疑似コードはこちら)。

- (void)setPosts:(NSDictionary*)newPosts
{
    if(newDict != posts) {

        [newPosts retain]; // retain the new value
        [posts release]; // release the old value
        posts = newPosts; // now posts reference the new value
    }
}

あなたへのシンプルな提案。

もしそうなら、あなたはself.posts = dataB負けdataAます。そのため、戻ってきたら、再度ダウンロードを実行する必要があります。では、ダウンロードしたデータのキャッシュを持つとはどういうことだと思いますか? たとえばNSMutableDictionary、各キーがページ (ページの番号など) であり、各値がデータ ( など) である を作成dataAdataBます。これにより、毎回データをダウンロードすることを避けることができます。メモリの問題を防ぐために、このキャッシュの制限 (たとえば 5 データ) を設定することもできます。

それが役に立てば幸い。

于 2012-05-24T13:03:11.283 に答える
0

ARC(自動参照カウント)を使用し、他のポインター(_strong)がそれを指している場合、自動的に解放されます。だから心配しないでください:)

于 2012-05-24T12:35:21.803 に答える