Как улучшить управление памятью при выполнении http низкоуровневой работы - PullRequest
0 голосов
/ 30 января 2011

Я начинаю очищать старый прототип, над которым работал, и он выполняет большую часть работы по низкоуровневому http.Проблема у меня заключается в том, как и когда сделать релиз внутри метода «connectionDidFinishLoading» ниже.У меня есть некоторые элементы, созданные только внутри if, но когда я отпускаю их перед вызовом метода, я получаю несколько ошибок BAD ACCESS и думал спросить, как я должен управлять памятью в этом сценарии.*

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 31 января 2011

некоторые обновления и комментарии:

- (void)searchForNewHats:(HatViewController *)hatVwController
{
    assert(0 == responseData);
    responseData = [NSMutableData new];
    assert(0 == hatController);
    self.hatController = hatVwController;

    NSURL * url = [NSURL URLWithString:@"http://localhost/jsondata"];
    NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];

    [request setHTTPMethod:@"GET"];

/* the delegate is retained in iOS, but not necessarily in OS X so... maybe you want to make connection an ivar of self? */
    NSURLConnection * connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    /* don't you want to hold on to this? */
    [connection release], connection = 0;
}

- (void)connectionDidFinishLoading:(NSURLConnection *)inConnection {
    if (ConnectionIsAnIvar) {
        if (self.connection != inConnection) {
            assert(0 && "connection delegate messages sent to wrong instance. threading issue or worse?");
            return;
        }
    }
    else {
        [connection release];
    }

    NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];

    NSArray *json = [responseString JSONValue];

    if (json != NULL) {
        NSArray *items = [json valueForKeyPath:@"d"];

        HatParseJson* hatParseJson = [[HatParseJson alloc] init];
        NSArray* hatz = [hatParseJson parseJson:items];

        NSMutableArray* newHats = [[NSMutableArray alloc] init];
        /* why not simply: 
                NSMutableArray* newHats = [hatz mutableCopy];
        */
        NSUInteger i, count = [hatz count];
        for (i = 0; i < count; i++) {
            Hat* obj = [hatz objectAtIndex:i];
            [newHats addObject:obj];

/* [obj release]; this blows up for example ... */
/* >> it should blow up. objectAtIndex: uses a get, not retain or copy */
        }
        [hatParseJson release];
        [hatController newHatJsonFinished:newReleases];
    }
    else {
        [hatController newHatJsonFinished:nil];
    }

    [responseString release];
}
0 голосов
/ 31 января 2011

[obj release] неправильно, потому что вы просто добавляете объекты из одного массива в другой. Вместо этого вы должны выпустить newHats когда закончите, потому что вы явно выделите его с alloc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...