Селектор цели CADisplayLink запускается после того, как он становится недействительным

У меня есть CADisplayLink, который запускает метод draw в объекте Director. Я хочу сделать недействительным CADisplayLink, а затем освободить некоторые одноэлементные объекты кэша, которые используются объектом Director. Одноэлементные объекты кэша не сохраняются методом draw .

В методе stopAnimation в Director (этот метод не связан с методом draw ), Я делаю:

[displayLink invalidate];

, а затем я начинаю освобождать одноэлементные объекты кэша, но затем срабатывает CADisplayLink и в последний раз вызывается метод draw . Методы draw пытаются получить доступ к освобожденным одноэлементным объектам, и все происходит сбой.

Это случается только иногда: бывают случаи, когда приложение не дает сбой, потому что объекты кэша освобождаются после того, как displayLink фактически аннулирован и метод рисования уже завершил работу.

Как я могу проверить, после аннулирования displayLink, что метод рисования завершил работу и не запускается снова, чтобы безопасно аннулировать объекты кэша? Я не хочу изменять метод draw , если это возможно.

Я пробовал несколько комбинаций, включая выполнение displayLink invalidate в основном потоке с использованием

[self performSelectorOnMainThread: @selector (stopAnimation) withObject: self waitUntilDone: YES]

или попытка выполнить это в currentRunLoop с помощью

[[NSRunLoop currentRunLoop] performSelector: @selector (stopAnimation) target: self аргумент: nil order: 10 режимов: [NSArray arrayWithObject: NSDefaultRunLoopMode]];

но результаты всегда одни и те же, иногда освобождает общие кэши слишком рано.

Я также не хочу использовать метод performSelector: withObject: afterDelay: с произвольной задержкой. Я хочу убедиться, что displayLink недействителен, что метод рисования завершен и больше не запускается.

9
задан Ricardo Sanchez-Saez 21 June 2011 в 00:01
поделиться