NSAutoreleasePool с JSON-данными


Просто нужно знать, если я делаю что-то неправильно в этом коде. мое приложение, кажется, работает сейчас быстро с этим кодом. Я просто хочу, если я действительно так понимаю, что

   - (void)receive
{


    NSString *post2 = [NSString stringWithFormat:@"expediteur=%@&destinataire=%@",
                       [[expediteurLbl text] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
                       [[destinataireLbl text] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

    NSData *dataToSend2 = [NSData dataWithBytes:[post2 UTF8String] length:[post2 length]  ];

    request2 = [[[NSMutableURLRequest alloc] init] autorelease];
    [request2 setURL:[NSURL URLWithString:@"http:/****************.php"]];
    [request2 setHTTPMethod:@"POST"];
    [request2 setHTTPBody:dataToSend2];
    [request2 setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"];

    [NSThread detachNewThreadSelector:@selector(displayView) toTarget:self withObject:nil]; 

    }

    -(void)displayView

    {
        NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
        NSURLResponse *response2;
        NSError *error2;
        NSData *data2 = [NSURLConnection sendSynchronousRequest:request2 returningResponse:&response2 error:&error2];
        reponseServeur2= [[NSMutableString alloc] initWithData:data2 encoding: NSASCIIStringEncoding];



        responseString2 = [[NSString alloc] initWithData:data2 encoding:NSUTF8StringEncoding];

        [[reponseServeur2 stringByReplacingOccurrencesOfString:@"\n"  withString:@""] mutableCopy];


        self.messageArray = [responseString2 JSONValue];
        [messTableView reloadData];




        [pool release];


    }

и

- (void)viewDidLoad {
    [super viewDidLoad];

    [self performSelectorInBackground:@selector(receive) withObject:nil];
}


393
1
задан 17 сентября 2011 в 12:09 Источник Поделиться
Комментарии
2 ответа

Я понимаю, что запрос2 является экземпляром переменной? Это рискованно в лучшем случае, чтобы установить его с autoreleased значение, а затем ожидать, что она будет действительна позже в displayView способ.

Но это, наверное, работает, потому что вы выполнять получите в фоновой задаче, и фоновые задачи имеют по умолчанию autorelease пул. Если бы не этот запрос2 , вероятно, пойти "пуф", прежде чем он добрался до displayView.

Так что все autoreleased объекты данных в Получите -- почте2, dataToSend2, запрос2, несколько временных строк, и как минимум один временный URL-адрес -- утечки.

2
ответ дан 17 сентября 2011 в 12:09 Источник Поделиться


Просто нужно знать, если я делаю что-то неправильно в этом коде.

Короткий ответ-да.


  1. запрос2 выделяется и autoreleased в другом потоке, чем его ссылка, и может быть dealloc бы, прежде чем вы получите, чтобы использовать его в displayView. Это будет 'гонки' и вы, наверное, не понимаешь, что происходит последовательно, но это будет работать, когда это произойдет.

  2. reponseServeur2 и responseString2 никогда не выпускались (или autoreleased) на всех. Эти утечки памяти

  3. Линия [[reponseServeur2 stringByReplacingOccurrencesOfString:@"\Н" withString:@""] mutableCopy]; ничего не делает. Вы хотите присвоить результат этого выражения в какой-либо переменной.

  4. Вы, кажется, повторить последовательность:

    self.messageArray = [responseString2 JSONValue];
    [messTableView reloadData];

    который, вероятно, просто опечатка.


  5. Все получение происходит без Autorelease пул, так почте2, dataToSend2, и запрос2 будет течь. Предупреждение вам отчет по почте2, наверное. Минимально, вы должны обернуть содержимое получают в NSAutoreleasePool как displayView.

1
ответ дан 17 сентября 2011 в 12:09 Источник Поделиться