我怎么让这不泄漏? (iphone sdk)

时间:2009-08-19 18:30:22

标签: iphone memory-management sdk

我实际上是一个返回URL的字符串实用程序。我知道当你执行[[NSString alloc] initWithFormat时,你必须通过manaully释放结果字符串。但这种情况有点复杂,我不知道如何处理它。

在这段代码中,我将从另一个类调用getChartURL方法:

http://pastie.org/588817

3 个答案:

答案 0 :(得分:1)

自动解决,同时解决您的泄漏问题。它可以非常方便,但不要过度使用它。在这种情况下使用似乎是合理的。

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

答案 1 :(得分: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;
    }

在这里你可能希望调用者保留字符串,如果他们愿意,你在这里为他们做这件事,如果使用不当会导致泄漏,我应该通过声明自动释放baseURL来实现这一点

  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:]而不是分配它们,但如果你分配它们,你必须在某处释放它们。

答案 2 :(得分: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的返回值做同样的事情。