ios rasguño efecto de tarjeta raspa

Necesito usar un efecto scratch para mi juego. aquí hay un código de ejemplo hace años.

https://github.com/oyiptong/CGScratch

Funciona bien, pero cuando lo uso junto con el controller de navigation, se bloquea.

Mi proyecto usa ARC, marca el file como -fno-objc-arc. Aquí está el código fuente:

https://github.com/lifesaglitch/ScratchWithError

se bloquea cuando presiono el controller de vista, luego aparece y luego vuelve a entrar.

Editar:

Cuando convierte todos en arco, y marca el controller de vista que utiliza la vista cero como -fno-objc-arc, funciona. Pero cuando marca la vista cero como -fno-objc-arc, se bloquea nuevamente. Mi proyecto usa arco y no creo que pueda convertir mi propio controller de vista para ser -fno-objc-arc.

Editar 2:

Modifico el código de initialization para:

scratchable = CGImageRetain([UIImage imageNamed:@"scratchable.jpg"].CGImage); 

Ya no falla, pero hay una pérdida de memory. y CGImageRelease se llamó una vez en el método dealloc.

Use CGImageCreateCopy .

La razón de esto es que usted envía un lanzamiento a su CGImageRef en su dealloc , pero si inspecciona el object CGImage real verá que apunta a la misma dirección de memory cada vez (supongo que es parte de las optimizaciones de Apple, por lo que es al igual que tendría un object static UIImage y reference su CGImage ).

Entonces, en su initWithFrame: debería get su rasgueable de esta manera:

 UIImage *sci = [UIImage imageNamed:@"scratchable.jpg"]; // This guy is always the same scratchable = CGImageCreateCopy(sci.CGImage); 

PD: Tuvo una pérdida real con pixels , por lo que también necesita un CFRelease(pixels);

Probé, analicé y midí el código y ahora parece estar bien.

Aquí también hay un enlace al proyecto fijo (también puse un controller de navigation y un button para presionar / abrir), y usa ARC, por supuesto.

Este funciona muy bien para mí https://github.com/moqod/iOS-Scratch-n-Ver !

En AppDelegate.m

  [window addSubview:viewController.view]; 

En su lugar, debería replacelo con:

  [window setRootViewController:viewController];