3

Я недавно перешел от использования 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.

Я что-то не хватает?

ответ

6

Surround код с новым @autoreleasepool блока:

@autoreleasepool { 
    // your c callback code here 
} 
+0

теперь я чувствую себя глупо: D Спасибо :) – cargath

+0

я ударил этого точно такую ​​же вещь, когда я мигрирующий некоторые GC-код к ARC месяца назад. Я так привык к блокам и тот факт, что [им не нужны явные пулы автозаполнения] (http://stackoverflow.com/questions/4141123/do-you-need-to-create-an-nsautoreleasepool-within-a -block-in-gcd), что я забыл создать один для фонового потока, который CVDisplayLink использует с его обратными вызовами. –

Смежные вопросы