Objective-C Есть ли способ узнать, установлен ли объект для автоматического выпуска? - PullRequest
2 голосов
/ 23 февраля 2012

Я смотрю отчет об утечке из приборов.Некоторые из моих утечек указывают на методы SBJSON.Мне трудно поверить, что возвращаемые значения не выпускаются автоматически, но при трассировке через код это становится очень утомительным, в том числе возвращая значения с помощью call-by-reference.Я не думаю, что трассировка кода - это правильный способ взглянуть на это.

Есть ли способ определить, сохраняется ли какой-либо объект в пуле автоматического выпуска?(Я не использую ARC.)

ОБНОВЛЕНИЕ

Вот код, на который мне указывает Instruments:

- (NSString *) processResults:(NSString *) resultsGeoCodeString {

    NSDictionary *resultsGeoCode = [resultsGeoCodeString JSONValue]; // <--- 100%
    ...

Я предполагаю, что "100%" означаетчто все утечки, сообщенные для этого случая, происходят из этой строки.

Я не освобождаю объект resultsGeoCode, потому что я предполагаю, что он автоматически выпущен.

Набор SBJSON, который я использую, не использует ARC.

Ответы [ 3 ]

2 голосов
/ 23 февраля 2012

Вообще говоря, знать, находится ли объект в пуле автоматического выпуска, бесполезно.Вы можете получить автоматически освобожденный объект обратно из метода, или вы можете получить постоянный объект, или одиночный объект, или объект, который фреймворк сохранил внутри для собственных целей.не SBJSON, который вызывает утечку.(SBJSON - очень популярная и хорошо используемая библиотека, и поэтому, вероятно, больше не будет серьезных утечек.) Затем проверьте, что вы делаете с утечкой объекта.Например, вы помещаете его в массив, который по какой-либо причине никогда не освобождается.Делаете ли вы авто-релиз в потоке без пула авто-релизов и т. Д.Попробуйте опубликовать свой код здесь.Другие могут обнаружить утечку.

2 голосов
/ 23 февраля 2012

Утечки показывают вам строку кода, которая вызвала утечку выделения, а не строку кода, которая вызывает избыточное сохранение.Следуйте за resultsGeoCode словарем вокруг;при условии отсутствия ошибок в библиотеке, где-то существует чрезмерное сохранение этого объекта.

Вы можете использовать Инструменты, чтобы показать все события сохранения / выпуска для любого данного объекта.

1 голос
/ 23 февраля 2012

Это примитивно, но вы можете переопределить метод автоматического освобождения, освобождения и сохранения (передача сообщения в супер) и установить сообщение журнала со счетчиком (при необходимости создайте подклассы).К сожалению, я не знаю другого метода, так как retainCount здесь вам мало поможет.

...