2011-02-10 12 views
0

潜在的なリークを次のコードで取得しています(returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];)潜在的なリークについて

+ (NSString *) getResponseFromServer:(NSString *) url 
{ 

NSString *URLString1 = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]]; 
if(URLString1 == NULL) 
{ 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Info" message:@"You must be connected to the Internet to use this app. Wireless , 3G and EDGE are supported" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
    alert.delegate = self; 
    [alert show]; 
    [alert release]; 
    return @"NO" ; 
} 

else 
{ 
//CFStringRef escapeChars = (CFStringRef) @":/?#[]@!$&’()*+,;="; 
// url = (NSString *) CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)url, NULL, escapeChars, kCFStringEncodingUTF8); 



url = [url stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]; 
//[self alert:escapedUrlString]; 


url=[url stringByReplacingOccurrencesOfString:@"%2526" withString:@"%26"]; 
//NSLog(@"url 2 = %@ ",url); 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
[request setURL:[NSURL URLWithString:url]]; 
NSLog(@"******Loading URL = %@",[NSURL URLWithString:url]); 

NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
NSString *returnString = @""; 
if(returnData) 
{ 
    returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; //Potential leak here... 

// NSRange range = [str rangeOfString:supplierSearchText.text options:NSCaseInsensitiveSearch]; 
    //NSLog(@"Searching = %d, %@, %@, %d", i, str, supplierSearchText.text, range.location); 
    //if(range.location == 0) 
    int num = [url rangeOfString:@"iphone_logout.php" options:NSCaseInsensitiveSearch].location; 
       NSLog(@">>>>>>>>> NUmber = %d", num); 
    if(isUserLoggedIn > 0 && global_Timer != nil && num > 1000) 
    { 
    if(((int)([url rangeOfString:@"iphone_user.php" options:NSCaseInsensitiveSearch].location) < 1000) || 
     ((int)([url rangeOfString:@"company_name.php" options:NSCaseInsensitiveSearch].location) < 1000) || 
     ((int)([url rangeOfString:@"company_search.php" options:NSCaseInsensitiveSearch].location) < 1000) || 
     ((int)([url rangeOfString:@"view_web.php" options:NSCaseInsensitiveSearch].location) < 1000)) 
    { 
     [global_Timer invalidate]; 
     NSLog(@">>>>>>>> Timer invalidating >>>>>>>>>>>>>>, %d, %d, %d, %d", ((int)([url rangeOfString:@"iphone_user.php" options:NSCaseInsensitiveSearch].location) > -1) , ((int)([url rangeOfString:@"company_name.php" options:NSCaseInsensitiveSearch].location) > -1) , ((int)([url rangeOfString:@"company_search.php" options:NSCaseInsensitiveSearch].location) > -1), ((int)([url rangeOfString:@"view_web.php" options:NSCaseInsensitiveSearch].location) > -1)); 
     global_Timer = [NSTimer scheduledTimerWithTimeInterval:(NSTimeInterval)300.0 target:global_SupplierToolsViewController selector:@selector(pressButton_Logout) userInfo:nil repeats:NO];   

    } 
    else { 
     NSLog(@"No matches found!, %d", (int)([url rangeOfString:@"iphone_user.php" options:NSCaseInsensitiveSearch].location)); 
    } 
    } 


} 
else //if(!networkFlag) 
{ 
    //networkFlag = YES; 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"Network connection failed! Try again later!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
    [alert show]; 
    [alert release]; 
    return @"NO"; 
} 
//[url release]; 
[request release]; 

return returnString; 
} 

} 

答えて

0

一致するリリースがないreturnStringを割り当てています。

はそうのように、自動解放の文字列を持ってみてください。

returnString = [NSString stringWithData:returnData encoding:NSUTF8StringEncoding]; 
1

リクエストを解放する前に返されるパスがあります。この回答を受け入れることで、受け入れ率が向上し、より多くの人が時間を過ごすことができます。

else //if(!networkFlag) 
{ 
    //networkFlag = YES; 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"Network connection failed! Try again later!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
    [alert show]; 
    [alert release]; 
    return @"NO"; 
} 
//[url release]; 
[request release]; 
1

文字列の作成にautoreleaseを追加できます。

通常、allocを使用する場合は、autoreleaseを使用するか、releaseを使用する必要があります。

+0

私はまた、自動解放を試みたが、私は、この「要求」をリリースすることができる場所、それがworking..soされていませんか..? – Madhumitha

+0

メソッドの最後にオブジェクトを戻すので、関数が終了するとオブジェクトの追跡が失われるので、autoreleaseを使用する必要があります。私はあなたの別の選択肢は、単にautorelease returnStringを割り当てることではなく、それを作成することだと思います。その後、 'if(returnData)'ブロック内でalloc initが行う別の変数を作ることができます。その新しい変数をreturnStringに代入して新しい変数を解放することができます。 – Walter

+0

私は次のNSStringを置く* returnString1 = [[NSString alloc] initWithData:returnDataエンコーディング:NSUTF8StringEncoding]; \t \t returnString = returnString1; \t \t [returnString1 release]; しかし、これはNSLog ...を使用してreturnStringを印刷しようとしましたが、working.itはクラッシュしました。 – Madhumitha