У меня есть CADisplayLink, который запускает метод draw
в объекте Director.Я хочу аннулировать CADisplayLink и затем освободить некоторые одноэлементные объекты Cache, которые используются объектом Director.Объекты Singleton Cache не сохраняются методом draw
.
В методе, называемом stopAnimation
в Director (этот метод не связан с методом draw
), я делаю:
[displayLink invalidate];
и затем я начинаю освобождать объекты Cache Singleton, но затем запускается CADisplayLink и метод draw
вызывается в последний раз.Методы draw
пытаются получить доступ к освобожденным одноэлементным объектам, и все происходит сбой.
Это происходит только иногда: в некоторых случаях приложение не падает, поскольку объекты Cache освобождаются после того, как displayLink фактически аннулировани метод рисования уже завершил работу.
Как я могу проверить, после аннулирования displayLink, что метод рисования завершил работу и что он не будет запускаться снова, чтобы так безопасно аннулировать объекты Cache?Я не хочу изменять метод draw
, если это возможно.
Я пробовал несколько комбинаций, включая выполнение displayLink invalidate
в главном потоке, используя
[self performSelectorOnMainThread:@selector(stopAnimation) withObject:self waitUntilDone:YES]
или попытка выполнить его в currentRunLoop с помощью
[[NSRunLoop currentRunLoop] performSelector:@selector(stopAnimation) target:self argument:nil order:10 modes:[NSArray arrayWithObject:NSDefaultRunLoopMode]];
, но результаты всегда одинаковы, иногда он освобождает общие кэши слишком рано.
Я также не хочу использовать метод performSelector:withObject:afterDelay:
с произвольной задержкой.Я хочу убедиться, что displayLink признан недействительным, что метод рисования завершен и что он больше не будет запускаться.