У меня есть 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 недействителен, что метод рисования завершен и больше не запускается.