«readInBackgroundAndNotify» увеличивает количество сохраненных получателей - PullRequest
1 голос
/ 07 февраля 2012

Я использую NSFileHandle для чтения данных из сокета.Вот как я создаю filehandle:

filehandle = [[NSFileHandle alloc] initWithFileDescriptor: sock closeOnDealloc: YES];

Я делаю это:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(readData:)    name:nil object:filehandle];
[filehandle readInBackgroundAndNotify];

Я заметил, что readInBackgroundAndNotify увеличивает retainCount из fileHandle на 1. Следовательно, когда я выпускаю этот filehandle, как только я закончу чтение данных, память не освобождается.И, следовательно, он пытается прочитать некоторые неверные данные, и приложение падает.Обратите внимание, что эта проблема возникает в ios 4.3, но не в ios 5. Я удаляю обозреватель перед выпуском filehandle.Есть ли что-то еще, что я должен сделать перед выпуском объекта дескриптора файла?

1 Ответ

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

Я заметил, что readInBackgroundAndNotify увеличивает retainCount fileHandle на 1.

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

Обратите внимание, что retainCount бесполезен;в этой ситуации он мог бы увеличиться на 5 или 42.Это не имеет значения.Суть в том, что вы просите его сделать что-то в фоновом режиме, и до тех пор, пока не будет достигнуто состояние «прекратить делать вещи в фоновом режиме», объект, вероятно, все еще будет живым.

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

Вы сказали дескриптору файла прекратить чтение в фоновом режиме?Может быть, это close?Если нет, то, скорее всего, он продолжится.

Разница между iOS 4 и 5 заключается в том, что может существовать логика, когда дескриптор файла отмечает, что больше нет наблюдателей и, таким образом, прекращает чтение автоматически.Опять же, деталь реализации, на которую не стоит рассчитывать.

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