Заставьте CVDisplayLink + Автоматический подсчет ссылок хорошо играть вместе - PullRequest
3 голосов
/ 12 января 2012

Я недавно переключился с использования NSTimer на CVDisplayLink, чтобы перерисовать мою анимацию OpenGL, но у меня возникла небольшая проблема с тем, чтобы она работала с включенным ARC:

/*
 * 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;
}

Функция обратного вызова для отображения ссылки должна бытьнаписанный на C, который будет использоваться в качестве параметра для

// 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.

Я что-то упустил?

1 Ответ

6 голосов
/ 12 января 2012

Окружить код новым блоком @autoreleasepool:

@autoreleasepool {
  // your c callback code here
}
...