Разработка IOS, функция возврата с if и else и авто-релиз - PullRequest
1 голос
/ 13 сентября 2011

У меня первое большое приложение, и у меня возникла небольшая проблема с управлением памятью.

-(id) dateFormatter:(id)date{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setTimeStyle:NSDateFormatterShortStyle];
    [dateFormatter setDateStyle:NSDateFormatterLongStyle];
    if([date isKindOfClass:[NSString class]])
        return [dateFormatter dateFromString:date];
     else
        return [dateFormatter stringFromDate:date];
}

Теперь, как я понимаю, для каждого возврата в этом примере в конце требуется авто-релиз. Но когда я добавляю autorelease, я получаю ошибку EXC_BAD_ACCESS, и без нее все работает отлично. Я проанализировал проблему и обнаружил, что в функции слишком много авто-выпусков, но я не вижу, как можно освободить память NSDateFormatter без нее.

Может кто-нибудь объяснить это?

Ответы [ 4 ]

3 голосов
/ 13 сентября 2011

Что делать:

-(id) dateFormatter:(id)date{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setTimeStyle:NSDateFormatterShortStyle];
    [dateFormatter setDateStyle:NSDateFormatterLongStyle];

    id retVal;
    if([date isKindOfClass:[NSString class]])
        retVal = [dateFormatter dateFromString:date];
     else
        retVal = [dateFormatter stringFromDate:date];
    [dateFormatter release];
    return retVal;

}
2 голосов
/ 13 сентября 2011

Да, пара проблем. Во-первых, вы используете dateFormatter, но не возвращаете его. Таким образом, когда вы инициализируете dateFormatter, вам нужно либо вызвать autorelease для него, либо вы должны иметь NSDateFormatter, предоставляющий вам автоматически выпущенный объект.

Например:

NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init] autorelease];

или

NSDateFormatter * dateFormatter = [NSDateFormatter dateFormatter];

второго метода не существует, но хорошо бы знать, как эти вещи обычно работают. В любом случае, использование первого метода, приведенного выше, исправит ваш код.

Когда вы вызываете [dateFormatter stringFromDate: date] или [dateFormatter dateFromString: date], dateFormatter вернет вам NSString или NSDate соответственно. В обоих случаях соответствующий метод stringFromDate: date или dateFromString: date создает для вас автоматически выпущенный объект NSString или NSDate.

Затем вы можете вернуть любой объект как есть, потому что он уже автоматически освобожден.

2 голосов
/ 13 сентября 2011

В качестве альтернативы вы можете сделать это:

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];

Также возможно, что вы не правильно присваиваете возвращаемую переменную, когда она возвращается.

2 голосов
/ 13 сентября 2011

Почему бы не использовать авто-релиз?

-(id) dateFormatter:(id)date{
    NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
    [dateFormatter setTimeStyle:NSDateFormatterShortStyle];
    [dateFormatter setDateStyle:NSDateFormatterLongStyle];
    if([date isKindOfClass:[NSString class]])
        return [dateFormatter dateFromString:date];
     else
        return [dateFormatter stringFromDate:date];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...