Я бы поспорил, проблема в следующем:
[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, и в этом случае проблема исчезнет, если вы закомментируете одно из двух утверждений.