0

iOS 3.0+ でのメモリ管理について別の質問がありました。[varialbe release] を実行した場合、その保持をオブジェクトに解放することはわかっていますが、コードは次のようになります -

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

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

    if (dict == nil) {

        [SystemStatusValues getInstance].isValidJson = NO;
        [SystemStatusValues getInstance].httpStatus = HTTP_STATUS_FAILED;

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

        NSArray *keys = [dict allKeys];        
        keys = [keys sortedArrayUsingFunction:keySortByInteger context:nil];

        self.keys = keys;
        self.posts = dict;
        NSLog(@"Posts : getPostsFromJson = %@", self.posts);

        if ([keys count] < TOTAL_SECTIONS) {

            [SystemStatusValues getInstance].isValidJson = NO;

        } else {

            [SystemStatusValues getInstance].isValidJson = YES;
            if (self.nextPosts == nil) {

            }

        }

        // [keys release];
        // [dict release];
        return;
    }
}

keys と dict の 2 つのローカル変数があることがわかります。コードの最後で [keys release] または [dict release] を呼び出す必要がありましたか? 実際にやったのですが、たまに潰れます。では、ローカル変数の場合、使用後に解放する必要はありませんか?

4

3 に答える 3

2

それは簡単です:

オブジェクトを割り当て、コピー、または保持する場合は、それを解放する必要があります。そうでなければ、あなたはしません。

したがって、キーまたは辞書のいずれかを解放する必要はありません (両方とも自動解放されます)。

于 2012-05-25T15:51:25.100 に答える
2

dict と keys は両方とも、自動解放されたオブジェクトへの参照です。それらを解放しないでください。解放すると、プログラムが終了します。You Don’t Own Objects Returned by Reference and You must not relinquish ownership of an object you do not own

では、ローカル変数の場合、使用後に解放する必要はありませんか? オブジェクトを所有している場合は、不要になったときに解放する必要があります。そのオブジェクトがローカル変数であるか ivar であるかは関係ありません。

これを読む -高度なメモリ管理プログラミングガイド

于 2012-05-25T15:43:27.770 に答える
0

keysアレイを解放しないでください。allKeysメソッドはおそらく自動解放されNSArrayたオブジェクトを返すためです。そのため、後でシステムによって解放されます。

deserializeAsDictionaryautoreleased も返すように見えるNSDictionaryので、リリースしないでください。

で作成されたオブジェクトのみをリリースしますalloc。この場合、外部メソッドを使用しています。そのメソッドに従い、そのオブジェクトが alloc で作成されているかどうかを確認する必要があります。

于 2012-05-25T15:45:41.933 に答える