Как мне освободить значение, которое я хочу вернуть? - PullRequest
1 голос
/ 24 марта 2012

Я знаю, что это довольно фундаментальный материал.

У меня есть класс с функцией, которая возвращает название месяца;Я не уверен, как выпустить значение, которое я хочу вернуть, чтобы предотвратить утечку.

В классе это значение объявлено:

static NSDateFormatter *formatter = nil;
if (formatter == nil) {
    formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"MMMM yyyy"];
}

Вещи случаются, а затем:

if([exampleDate isEqualToDate:
    [[self creationDate] laterDate:exampleDate]])
{ //earlierDate returns the earlier date
    return(@"Examples");
}else{
    return([formatter stringFromDate:[self creationDate]]);
}

Я пытался использовать авто-релиз, но я использую его неправильно, потому что у меня происходит сбой при попытке освободить его.Я также пытался присвоить возвращаемое значение в строку, но у меня есть те же проблемы сбоя.Извините за вопрос, который является настолько фундаментальным, но я был бы признателен, если бы знал, как правильно его выпустить, и в то же время возвращал значение, и понимал, как это работает.

1 Ответ

0 голосов
/ 24 марта 2012

в обратной части нет утечек.Так как stringFromDate: не является copy, mutableCopy, retain, alloc или new, он возвращает уже автоматически выпущенный объект.

Ваш NSDateFormatter будет вытекать после освобождения класса.Если вы не хотите, чтобы он протекал, вы должны создать для него @property и выпустить его в dealloc.
Локальные статические объекты всегда будут протекать.
Я бы не использовал такие объекты вне синглетонов.Каждый раз, когда вы создаете один из ваших классов, вы будете пропускать NSDateFormatter.Использование @property лучше почти во всех случаях.

Я видел подобные хаки, но, по-моему, они решают проблему, с которой вам не следует сталкиваться:

- (NSString *)someDateFromString:(NSString *)str {
    static NSDateFormatter *formatter = nil;
    if (formatter == nil) {
        formatter = [[NSDateFormatter alloc] init];
    }
    if (str == nil) {
        [formatter release];
        formatter = nil;
        return nil;
    }
    // do something
    return date;
}

- (void)dealloc {
    [self someDateFromString:nil]; // will release the static date formatter.
    [super dealloc];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...