ошибка iPhone, «объект со ссылками считается использованным после того, как он выпустил ошибку»; устранение утечки памяти - PullRequest
1 голос
/ 17 января 2011

Я пытаюсь устранить утечки памяти и другие проблемы в существующем приложении для iPhone.Я немного новичок в Objective C, но у меня есть некоторые хорошие основы программирования и общее понимание управления памятью, которое требуется при разработке приложений для iphone.Мой вопрос о следующем методе, приведенном ниже.

  -(NSDate *)formatDate:(id)value{
NSLog(@"eja: DetailViewController/ formatDate()");

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.S"];
[dateFormatter release];


return [dateFormatter dateFromString:value];


}

Возвращается сообщение об ошибке « Объект с отсчетом ссылок используется после его освобождения ».Я вижу, что dateFormatter освобождается перед его возвращением / использованием.Проблема, конечно, в том, что если вы поместите выпуск после оператора return, вы получите ошибку «Потенциальная утечка объекта», связанную с объявлением var dateFormatter.

Я также пытался "autorelease"

return [[dateFormatter dateFromString:value] autorelease];

Но затем я получаю сообщение об ошибке ' Объект отправлен - авто-релиз слишком много раз '.

AnyНесколько советов о том, как правильно написать это, чтобы правильно управлять переменными?

Ответы [ 3 ]

2 голосов
/ 17 января 2011

Заменить

[dateFormatter release];

с

[dateFormatter autorelease];

и должно работать!

2 голосов
/ 17 января 2011

Вы можете создать NSDate до того, как отпустите NSDateFormatter:

-(NSDate *)formatDate:(id)value
{
    NSLog(@"eja: DetailViewController/ formatDate()");

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.S"];
    NSDate *date = [dateFormatter dateFromString:value];
    [dateFormatter release];

    return date;
}

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

0 голосов
/ 18 января 2011

Вместо записи [dateFormatter release] вы можете автоматически выпустить его и даже сохранить строку кода в процессе.

- (NSDate *)formatDate:(NSString *)value {
    NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.S"];
    return [dateFormatter dateFromString:value];
}
...