2012-01-29 2 views
0

im new with objective-c. 아이폰 앱을 개발할 때 메모리 누수 문제가 있습니다. Xcode의 유출 유틸리티는 'combArr'-> 'results'객체의 누수 문제를 보여줍니다. 당신이해야합니다, 아이폰 SDK, 메모리 누수

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

메모리를 할당 할 때마다 도움을 주셔서 감사합니다 :이있는 NSArray를 URL에서 JSON을 구문 분석하고 돌려 내 함수 :

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

와 나는 여기에이 기능을 실행 그것을 놓아 라. (할당, 복사, 보유). itemsApi이 아니라 myApi을 릴리스합니다. 이것을 시도하십시오 ...

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

그것은 'getListing2'함수를 실행하고 getListing2를 다시 설정하는 것보다 나중에 'listOfItems'및 'priceArr'을 다른 동작으로 릴리스하는 데 도움이되지 않습니다. – Testme

+0

'itemsApi'를 제외하고는 원래 코드에서 릴리스되지 않은 항목이 표시되지 않습니다. . 먼저 여기에 게시 한 코드에서 누출 된 것이 확실합니까? 둘째,'[listOfItems release];와'[priceArr release];'둘 다 나중에 실행될 것입니까? 여기에 중단 점을 추가하고 디버거를 사용하여 각 코드 행으로 이동하여 해당 객체가 실제로 릴리스되는지 확인하십시오. –