【问题标题】:how do i make this not leak? (iphone sdk)我怎样才能使它不泄漏? (iPhone SDK)
【发布时间】:2009-08-19 18:30:21
【问题描述】:

我实际上有一个返回 URL 的字符串实用程序。我知道当您执行 [[NSString alloc] initWithFormat 时,您必须手动释放结果字符串。不过这个案子有点复杂,不知道怎么处理。

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

http://pastie.org/588817

【问题讨论】:

  • 阅读自动释放方法和自动释放池。它们是专门为处理这个问题而设计的。此外,如果您使用类方法 stringWithFormat ,它将返回一个自动发布的 NSString 版本。

标签: iphone memory-management sdk


【解决方案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 声明 autorelease 所以

  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】:

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

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

    【讨论】:

      【解决方案3】:

      suffix 和 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 的返回值做同样的事情。

      【讨论】:

        猜你喜欢
        • 2023-01-11
        • 1970-01-01
        • 1970-01-01
        • 2011-07-10
        • 1970-01-01
        • 2021-05-27
        • 2013-07-24
        • 2015-12-23
        • 1970-01-01
        相关资源
        最近更新 更多