2012-01-29 3 views
0

im новый с объективом-c. У меня проблема с утечкой памяти при разработке приложения iphone. Утечка утилиты в Xcode показывает, что проблема с утечкой с объектом 'combArr' -> 'results'. Существует моя функция разбора JSON из URL и возвращает NSArray:Iphone sdk, утечка памяти

- (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]; 

Благодарим Вас за помощь

ответ

0

Каждый раз, когда вы выделяете память, вы должны освободить его. (выделить, скопировать, сохранить). Вы выпускаете 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 обрабатывает освобождение всей памяти. Небольшое бремя с ваших плеч и еще одно дело, о котором вы можете беспокоиться.

+0

Если вы все еще протекаете, попробуйте добавить '[listOfItems release];' и '[priceArr release];'. или убедитесь, что вы выпускаете их где-то позже! –

+0

это не помогло мне, я выпустил «listOfItems» и «priceArr» позже на другое действие, чем выполнил функцию getListing2 и снова установил getListing2 – Testme

+0

Я не вижу ничего, что осталось от вашего исходного кода, кроме 'itemsApi' , Во-первых, вы уверены, что утечка произошла из кода, который вы разместили здесь? и во-вторых, вы уверены, что '[listOfItems release];' и '[priceArr release];' оба исполняются позже? Попробуйте добавить точку останова и перейдите в каждую строку кода, используя отладчик, чтобы убедиться, что эти ojbect фактически освобождены. –

Смежные вопросы