Как я могу сделать это не утечка? (iphone SDK) - PullRequest
0 голосов
/ 19 августа 2009

У меня есть строковая утилита, которая возвращает URL. Я знаю, что когда вы делаете [[NSString alloc] initWithFormat, вы должны вручную освободить строку результата. Но этот случай немного сложен, и я не знаю, как с ним справиться.

В этом фрагменте кода я буду вызывать метод getChartURL из другого класса:

http://pastie.org/588817

Ответы [ 3 ]

1 голос
/ 19 августа 2009
 +(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;
    }

Здесь вы, вероятно, хотите, чтобы вызывающая сторона сохранила строку, если они того пожелают, вы делаете это для них здесь, и она может вызвать утечки, если не используется должным образом, как я мог бы это кодировать, объявив autorelease для 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:], но если вы выделяете их, вы должны их где-то освобождать.

1 голос
/ 19 августа 2009

Суффикс и меткиSuffix должны быть освобождены после их добавления.

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

может быть изменено на:

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

Возможно, вы также захотите сделать то же самое с возвращаемым значением для getBaseURL над ним.

1 голос
/ 19 августа 2009

Авто-релиз пока решает ваши утечки. Это может быть очень удобно, но не злоупотребляйте им. Хотя в данном случае целесообразно использовать.

+(NSString*) getBaseURL {
    …
    return [baseURL autorelease];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...