2012-01-29 11 views
0

im new with objective-c。私は、iPhoneアプリを開発するときにメモリリークに問題があります。 Xcodeのユーティリティが漏れていると、 'combArr' - > 'results'オブジェクトの問題が漏れていることがわかります。そこのURLからJSONを解析し、私の関数であり、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

を支援するために、あなたがメモリを割り当てるたびにありがとう、あなたがしなければなりませんそれをリリースする。 (割り当て、コピー、保持)。 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

これは私には役に立ちませんでした。後で、 'listOfItems'と 'priceArr'を他のアクションでリリースしました。 'getListing2'関数を実行してgetListing2を再度設定するより – Testme

+0

'itemsApi'以外のオリジナルコードから解放されたものは表示されません。まず、あなたがここに投稿したコードからそれが漏れていることを確かめますか?次に、 '[listOfItems release];と' [priceArr release]; 'がどちらも後で実行されるのでしょうか?ここにブレークポイントを追加して、デバッガを使用して各コード行にステップを進めて、それらのオブジェクトが実際にリリースされていることを確認してください。 –