2009-08-19 55 views
0

我實際上是一個字符串實用程序,它返回一個URL。我知道當你執行[[NSString alloc] initWithFormat時,你必須手工釋放結果字符串。但是這種情況有點複雜,我不知道如何處理它。我該如何讓這個不泄漏? (iphone sdk)

此代碼段中,我會從另一個類中調用getChartURL方法:

http://pastie.org/588817

+0

閱讀autorelease方法和自動發佈池。它們專門用於解決這個問題。此外,如果您使用類方法stringWithFormat,它將返回NSString的自動發佈版本。 – Lounges 2009-08-19 18:57:57

回答

1
+(NSString*) getBaseURL { 
     NSUserDefaults *userSettings = [NSUserDefaults standardUserDefaults]; 
     NSString* host = [userSettings stringForKey:@"host"]; 
     NSString* port = [userSettings stringForKey:@"port"]; 
     NSString* baseURL = [[NSString alloc] initWithFormat: @"http://%@:%@", host, port]; 
     return baseURL; 
    } 

在這裏,你可能想調用者保留的字符串,如果他們願意的話,你在這裏做了他們,如果使用不當,它可能會導致泄漏,IW烏爾德代碼這個問題的方法是通過聲明自動釋放爲使基本URL

NSString* baseURL = [[[NSString alloc] initWithFormat: @"http://%@:%@", host, port]autorelease]; 
     return baseURL; 
    } 

這裏

+(NSString*) getChartURL:(int)width height:(int)height labels:(BOOL)labels time:(int)time monitorId:(NSString*)monitorId ruleInstanceId:(NSString*)ruleInstanceId { 
      NSString* returnURL; 
      if ([self isConfigured]){ 
       NSString* suffix = [[NSString alloc] initWithFormat: @"/Mobile/ChartServlet?width=%d&height=%d&time=%d&monitor_id=%@&rule_instance_id=%@", width, height, time, monitorId, ruleInstanceId]; 
       returnURL = [[self getBaseURL] stringByAppendingString:suffix]; 
      } else { 
       if (width == 320) { 
        returnURL = @"http://Iphoneopt.bravehost.com/smallchart.png"; 
       } else { 
        returnURL = [[NSString alloc] initWithFormat: @"http://Iphoneopt.bravehost.com/largechart%d.png", time]; 
        labels = FALSE; 
       } 
      } 
      if (labels) { 
       NSString* labelsSuffix = [[NSString alloc] initWithFormat: @"&labels=%d", labels]; 
       returnURL = [returnURL stringByAppendingString:labelsSuffix]; 
      } 

      NSLog(@"returnURL=%@", returnURL); 
      return returnURL; 
     } 

在這裏你不會釋放任何你分配的字符串,我建議使用[NSString stringWithFormat:]來代替它們,但是如果你分配它們,你必須在某處釋放它們。

1

自動釋放,同時解決你的漏洞。它可以非常方便,但不要過度使用它。在這種情況下使用似乎是合理的。

+(NSString*) getBaseURL { 
    … 
    return [baseURL autorelease]; 
} 
1

後綴和labelsSuffix都需要在你追加後釋放。

returnURL = [[NSString alloc] initWithFormat: @"http://Iphoneopt.bravehost.com/largechart%d.png", time]; 

可改爲:

returnURL = [NSString stringWithFormat: @"http://Iphoneopt.bravehost.com/largechart%d.png", time]; 

你可能也想做同樣與getBaseURL它上面的返回值。