Что такое tiny_free_list_add_ptr? - PullRequest
0 голосов
/ 17 июля 2009

Я искал повсюду его значение. Я предполагаю, что у меня как-то поврежден стек. Я получаю

крошечный _ free_ list_ add_ ptr

на 16-м вызове линии, которая говорит:

NSDateFormatter *theFormatter = [[NSDateFormatter alloc] init];

В чем причина проблемы? Правильно ли я считаю, что у меня поврежденный стек?

    - (NSString *)formatDate:(NSString *)uglyDate withFormat:(NSString *)theFormat {

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSDateFormatter *theFormatter = [[NSDateFormatter alloc] init];
    [theFormatter setDateFormat:theFormat];

    NSDate *realDateUgly = [NSDate dateWithNaturalLanguageString:uglyDate];
    if (realDateUgly == nil)
        realDateUgly = [NSDate dateWithString:uglyDate];

    NSString *prettyDate = [[NSString alloc] initWithString:[theFormatter stringFromDate:realDateUgly]];

    [pool drain];
    [pool release];    
    [theFormatter release];
    return prettyDate;

}

Ответы [ 3 ]

2 голосов
/ 17 июля 2009
  1. Я сомневаюсь, что вам нужен бассейн здесь.
  2. Ты перевыпускаешь пул. drain совпадает с release в коде без GC. (release так же избыточен в коде GC, потому что тогда это не работает.)
  3. Вы протекаете prettyDate. Вы должны сделать это автоматически. (Конечно, это не будет работать с пулом вокруг него, что является хорошей причиной, чтобы убить этот пул.)

После того, как вы прочитаете Руководство по программированию управления памятью для какао и исправите свои проблемы с управлением памятью, вы должны либо найти проблему исправленной, либо, по крайней мере, лучше ее отследить.

Если после устранения проблемы с управлением памятью проблема не устранена, отредактируйте вопрос, включив в него полную трассировку стека.

0 голосов
/ 18 июля 2009

Я бы поспорил, проблема в следующем:

[pool drain];
[pool release];

В не-GC приложении сток "ведет себя" как релиз. «Поведение» - это слово, используемое в документации, но документация немного двусмысленна, когда вам нужно быть педантично точным относительно того, что именно происходит, когда вызывается -drain. Мне, по крайней мере, «ведет себя» позволяет немного простора для маневра, особенно по сравнению с «утечка точно такая же, как выпуск», что оставляет гораздо меньше места для интерпретации.

Причина, по которой я поднимаю этот вопрос, заключается в том, «что происходит с пулом автоматического выпуска после вызова -drain?» Я не смог найти удовлетворительного ответа в документации на этот вопрос. В разных местах документация подразумевает, что при работе в режиме GC -drain ведет себя как «подсказка системе GC» и вызывает objc_collect_if_needed(). Я не смог найти ничего, что явно говорит о том, что при работе в режиме GC пул авто-выпусков, которому было отправлено сообщение -drain, «больше не действителен» (то есть что-то вроде поведения, как будто ему было отправлено сообщение об освобождении). Ничто из того, что я смог найти в документации, явно запрещает отправку экземпляру объекта NSAutoreleasePool экземпляра -drain несколько раз при работе в GC.

Самая близкая вещь, которую я смог найти, была в верхней части документации класса NSAutoreleasePool: «истощение пула в конечном итоге приводит к его освобождению». Это мало помогает нам здесь. Контекст, из которого это было взято, не очень ясно относительно того, применимо ли это к режиму GC или не-GC. В любом случае, оно квалифицируется как «в конечном счете», что по определению в педантичном словаре означает «не сейчас, но в конце концов». Без уточнения «в конечном счете» однозначно выясняется, был ли освобожден экземпляр созданного объекта пула автоматического выпуска, и по индукции отправка дополнительных сообщений этому указателю приведет к неопределенному поведению.

Так что, поскольку я не могу указать на что-либо авторитетное в поддержку этого, я считаю, что -drain в режиме без GC ведет себя «точно» как -release (скорее всего, реализован внутренне как [самоотпуск]) , Если это так, то вы «слишком выпустили» объект NSAutoreleasePool, и в этом случае проблема исчезнет, ​​если вы закомментируете одно из двух утверждений.

0 голосов
/ 17 июля 2009

Полагаю, вы зависаете в tiny_free_list_add_ptr. Если так, то tiny_free_list_add_ptr звучит как функция, которую реализация malloc будет использовать для отслеживания блоков памяти в куче. Если куча повреждена, я ожидаю, что такая функция завершится сбоем.

Вы, вероятно, слишком много выпускаете (например, пул автоматического выпуска, на который указал Питер) здесь или другим способом.

Вы должны попробовать запустить с установленной переменной окружения NSZombiesEnabled. Смотри http://developer.apple.com/technotes/tn2004/tn2124.html#SECFOUNDATION

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...