Я недавно перешел от использования NSTimer в CVDisplayLink перерисовывать мой OpenGL анимации, но у меня есть небольшая проблема, что делает его работу с ARC включается:Сделать CVDisplayLink + Автоматический подсчет ссылок хорошо играть вместе
/*
* This is the renderer output callback function.
*/
static CVReturn displayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeStamp* now, const CVTimeStamp* outputTime, CVOptionFlags flagsIn, CVOptionFlags* flagsOut, void* displayLinkContext)
{
// now is the time to render the scene
[((__bridge BDOpenGLView*)displayLinkContext) setNeedsDisplay:YES];
// always succeeds, because we don't actually do anything here anyway
return kCVReturnSuccess;
}
функция отображения ссылки обратного вызова должна быть написано на с, которые будет использоваться в качестве параметра для
// set the renderer output callback function
CVDisplayLinkSetOutputCallback(displayLink, &displayLinkCallback, (__bridge void*)self);
так я не могу использовать self
течение в обратном вызове, но с использованием ((__bridge BDOpenGLView*) displayLinkContext)
производит утечку памяти:
objc[29390]: Object 0x1001b01f0 of class NSConcreteMapTable autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
Я читал, что я должен сам установить NSAutoreleasePool
, но я не могу включить ARC.
Я что-то не хватает?
теперь я чувствую себя глупо: D Спасибо :) – cargath
я ударил этого точно такую же вещь, когда я мигрирующий некоторые GC-код к ARC месяца назад. Я так привык к блокам и тот факт, что [им не нужны явные пулы автозаполнения] (http://stackoverflow.com/questions/4141123/do-you-need-to-create-an-nsautoreleasepool-within-a -block-in-gcd), что я забыл создать один для фонового потока, который CVDisplayLink использует с его обратными вызовами. –