Iphone SDK, утечка памяти - PullRequest
       1

Iphone SDK, утечка памяти

0 голосов
/ 30 января 2012

я новичок с целью-c.У меня проблема с утечкой памяти при разработке приложения для iphone.Утилита утечки в Xcode показывает, что проблема утечки с объектом 'combArr' -> 'results'.Есть моя функция, которая разбирает json из URL и возвращает NSArray:

- (NSArray *)getListing2:(NSString *)item
                         from:(int)country {
    //sending post request with some params
    NSString *post = [@"product=" stringByAppendingString:item];
    NSString *countryStr = [NSString stringWithFormat:@"&country=%d", country];
    post = [post stringByAppendingString:countryStr];
    NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
    NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];

    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    NSString *url = [prefs objectForKey:@"urlToApi"];
    url = [url stringByAppendingString:@"/get-items/"];
    [request setURL:[NSURL URLWithString:url]];
    [request setHTTPMethod:@"POST"];
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody:postData];
    NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    [request release];

    //receiving json
    NSString *jsonString = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];
    SBJsonParser *json = [[SBJsonParser alloc] init];
    NSError *error = nil;
    //parsing json to nsdictionary
    NSDictionary *results = [[NSDictionary alloc] initWithDictionary:[json objectWithString:jsonString error:&error]];
    [json release];
    [jsonString release];

    //generate array of items
    NSMutableArray *listOfItems = [[NSMutableArray alloc] init];
    for (int i = 0; i < [[results objectForKey:@"data"] count]; i++) {
        [listOfItems addObject:[[results objectForKey:@"data"] objectForKey:[NSString stringWithFormat:@"%d", i]]];
    }

    //saving items array and count info object into one array
    NSArray  * returnArr = [[[NSArray arrayWithObjects:listOfItems, [results valueForKey:@"count_info"], nil] retain] autorelease];

    [listOfItems release];
    [results release];

    return returnArr;
}

И я выполняю эту функцию здесь:

myApi *itemsApi = [[myApi alloc] init];
NSArray  *combArr = [[izdApi getListing2:item from:countryId] retain];
[itemsApi release];
listOfItems = [[combArr objectAtIndex:0] retain];
if([listOfItems count] > 0){
    priceArr = [[combArr objectAtIndex:1] retain];
}
else{
    totalCount = 0;
}
[combArr release];

Спасибо за помощь

1 Ответ

0 голосов
/ 30 января 2012

Каждый раз, когда вы выделяете память, вы должны освободить ее. (выделить, скопировать, сохранить). Вы выпускаете myApi, а не itemsApi. Попробуйте это ...

myApi *itemsApi = [[itemsApi alloc] init];
NSArray  *combArr = [[izdApi getListing2:item from:countryId] retain];
[itemsApi release];
listOfItems = [[combArr objectAtIndex:0] retain];
if([listOfItems count] > 0){
priceArr = [[combArr objectAtIndex:1] retain];
}
else{
    totalCount = 0;
}
[combArr release];

Если вы используете Xcode 4, попробуйте включить ARC. Короче говоря, ARC обрабатывает освобождение всей памяти. Небольшая ноша с плеч и еще одна вещь, о которой вам стоит беспокоиться.

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