Objective-c для iphone: утечка тайной памяти - PullRequest
0 голосов
/ 26 мая 2010

У моего приложения, похоже, 4 утечки памяти (на устройстве, запущенных инструментах).

Утечки памяти происходят из этого кода:

NSURL *url = [self getUrl:destination];
[destination release];

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];

[request setHTTPMethod:@"GET"];
[request addValue:@"application/json" forHTTPHeaderField:@"content-type"];
NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];
[request release];

[connection release];

РЕДАКТИРОВАТЬ : добавлен код для getUrl

- (NSURL *)getUrl:(NSString *)actionUrl
{
    NSString *rawUri = [[NSString alloc]initWithFormat:@"%@/%@", kBaseUrl, actionUrl];
    NSURL *url = [[[NSURL alloc] initWithString:rawUri] autorelease];
    [rawUri release];
    return url;
}

Я высвобождаю все свои объекты, насколько я могу видеть, но это все еще показывает это как источник 4 утечек памяти.

Это на устройстве под управлением 3.1.3

Допустимо ли иметь несколько утечек памяти в вашем приложении или все они должны быть устранены?

РЕДАКТИРОВАТЬ : Я добавил авто-релиз в getUrl. Однако это все еще обнаруживается с утечками памяти

EDIT2 : поведение довольно странное. Я запускаю приложение и нажимаю кнопку, которая делает этот вызов один раз. 4 утечки обнаружены. Я нажимаю назад и снова нажимаю на кнопку, и продолжаю делать это несколько раз, и все еще только 4 утечки. Однако, если я подожду несколько секунд, а затем нажму кнопку усиления еще несколько раз, обнаруживаются 9 утечек. Это не маленькая 128-байтовая утечка, но на этом этапе она составляет 1,61 КБ.

РЕДАКТИРОВАТЬ3 : Вот соединениеDiFinishLoading

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    SBJSON *jsonParser = [[SBJSON alloc] init];
    NSString *jsonString = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding];
    [receivedData setLength:0];
    [receivedData release];
    [self.delegate dataReceived:[jsonParser objectWithString:jsonString]]; // See method below
    [jsonParser release];
    [jsonString release];
}

Делегат получает данные, затем преобразует их (и, в свою очередь, передает их другому делегату после создания продукта)

- (void)dataReceived:(id)data
{
    NSMutableArray *myObjects = [[NSMutableArray alloc]init];
    ObjectFactory *objectFactory = [[ObjectFactory alloc]init];

    // Only one object
    if ([data isKindOfClass:[NSDictionary class]])
    {
        Object *object = [objectFactory buildObject:data];
        [myObjects addObject:object];
        [object release];
    }

    // Multiple objects
    if ([data isKindOfClass:[NSArray class]])
    {
        for (NSDictionary *objectSrc in data)
        {
            Object *object = [objectFactory buildObject:post];
            [myObjects addObject:object];
            [object release];
        }
    }
    [objectFactory release];
    [self.delegate objectsReceived:myObjects];
}

EDIT4 : Я заметил, что объект ConnectionObject, содержащий NSUrlConnection, никогда не освобождается.

Я поставил точку останова на dealloc , которая вызывает [освобождение соединения] Эта сделка никогда не называется. Все раскладки вызываются по цепочке, кроме этой. Я попытался [соединение отменить] в вызове "connectionDidFinishLoading", чтобы увидеть, помогло ли это, но не помогло вообще.

Для меня это загадка ...

1 Ответ

0 голосов
/ 26 мая 2010

Вы выпускаете то, что не должны:

NSURL *url = [self getUrl:destination]; 
// the returned url should have been autoreleased by the getUrl: method
// so you shouldn't release it again

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];

[url release]; // don't do this!

Помните, что вы должны освобождать только объекты, созданные с использованием alloc , new или retain Объекты, возвращаемые из других методов, всегда находятся в состоянии auoreleased (по соглашению).

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