2012-01-29 132 views
0

即时通讯使用objective-c。我在开发iPhone应用程序时遇到内存泄漏问题。 Xcode中的泄漏实用程序显示泄漏问题与'combArr' - >'结果'对象。还有就是我的函数从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

你分配内存每一次,你必须释放它。 (分配,复制,保留)。 您正在发布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];'。或者确保你稍后将它们释放! – 2012-01-29 20:52:39

+0

它没有帮助我,即时发布'listOfItems'和'priceArr'后面的其他行动,比执行函数'getListing2'并再次设置getListing2 – Testme 2012-01-29 21:11:57

+0

我没有看到任何东西没有从您的原始代码发布,除了'itemsApi' 。首先,你确定自己发布的代码泄露了吗?第二,你确定'[listOfItems release];'和'[priceArr release];'都是以后执行的吗?尝试在这里添加一个断点,并使用调试器进入每行代码,以确保这些ojbects实际上正在发布。 – 2012-01-29 21:19:42