Помогите с утечкой памяти - PullRequest
0 голосов
/ 11 апреля 2011

Я создал класс, который использует NSURLConnection и KVC для создания объектов из списков на сервере.Instruments сообщает, что у меня есть куча утечек памяти из-за функции, которая обрабатывает данные, возвращаемые с сервера:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
    hasOutstandingCall = NO;
    NSError* sError;

    NSDictionary* tmpDict = [NSPropertyListSerialization propertyListWithData:receivedData 
        options:NSPropertyListImmutable
        format:NULL error:&sError];
    self.lastResponse = [ServerResponse new];
    //NSLog(@"server responded: %@",tmpDict);
    [lastResponse setValuesForKeysWithDictionary:tmpDict];
    if(tmpDict.count == 0){
        lastResponse.success = NO;
        lastResponse.errorId = -1;
        lastResponse.errorMessage = @"Couldn't understand server response";
        [[NSNotificationCenter defaultCenter] postNotificationName:@"serverDidRespond" object:self];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"requestDidFail" object:self];
        NSLog(@"failed to deserialize response");
        NSString* serverMessage = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding];
        NSLog(@"SERVER SAID: %@",serverMessage);

        [serverMessage release];
        [receivedData release];
        return;
    }

    [[NSNotificationCenter defaultCenter] postNotificationName:@"serverDidRespond" object:self];

    if(lastResponse.success){
        if(lastResponse.resultQuery)
            NSLog(@"%@ response: query with %d rows",lastFName, lastResponse.resultQuery.count);
        else if(lastResponse.resultObject)
            NSLog(@"%@ response: object",lastFName);
        [[NSNotificationCenter defaultCenter] postNotificationName:@"requestDidSucceed" object:self];
    }else{
        NSLog(@"%@ response: ERROR id: %d, message: %@",lastFName, lastResponse.errorId, lastResponse.errorMessage);
        [[NSNotificationCenter defaultCenter] postNotificationName:@"requestDidFail" object:self];
    }

    [receivedData release];
}

Instruments говорит, что я передаю ответ сервера, и множество других вещей, которые проходят через этофункция.Всегда ли вещь «Ответственный фрейм» ссылается на то, что изначально создало пропущенный объект, несмотря ни на что?Должен ли я просто искать, как этот материал просочится в будущем, или у меня есть проблема в этой функции?Насколько я понимаю, tempDict, sError автоматически высвобождаются, когда возвращаются из сериализации.Я отправляю предположительно просочившийся serverResponse в синтезированный установщик, который освобождается в методе dealloc, поэтому я не вижу, в чем проблема.У кого-нибудь есть понимание?

1 Ответ

2 голосов
/ 11 апреля 2011
self.lastResponse = [ServerResponse new];

Это, скорее всего, двойное удержание, при условии, что lastResponse является @property, объявленным как retain (или ваш установщик сохраняет).

Когда Instruments идентифицирует утечку, он показываетгде пункт был выделен, но это не может быть причиной утечки.Утечка всегда будет несбалансированной задержкой, но только иногда эта задержка будет находиться на той же строке распределения (как это было в данном случае, по-видимому).

...