我實際上是一個字符串實用程序,它返回一個URL。我知道當你執行[[NSString alloc] initWithFormat時,你必須手工釋放結果字符串。但是這種情況有點複雜,我不知道如何處理它。我該如何讓這個不泄漏? (iphone sdk)
此代碼段中,我會從另一個類中調用getChartURL方法:
我實際上是一個字符串實用程序,它返回一個URL。我知道當你執行[[NSString alloc] initWithFormat時,你必須手工釋放結果字符串。但是這種情況有點複雜,我不知道如何處理它。我該如何讓這個不泄漏? (iphone sdk)
此代碼段中,我會從另一個類中調用getChartURL方法:
+(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:]來代替它們,但是如果你分配它們,你必須在某處釋放它們。
自動釋放,同時解決你的漏洞。它可以非常方便,但不要過度使用它。在這種情況下使用似乎是合理的。
+(NSString*) getBaseURL {
…
return [baseURL autorelease];
}
後綴和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它上面的返回值。
閱讀autorelease方法和自動發佈池。它們專門用於解決這個問題。此外,如果您使用類方法stringWithFormat,它將返回NSString的自動發佈版本。 – Lounges 2009-08-19 18:57:57