ios刮刮卡效果崩溃

OMG*_*POP 8 iphone core-graphics ios

我需要为我的游戏使用划痕效果.这是几年前的示例代码.

https://github.com/oyiptong/CGScratch

它工作正常,但当我与导航控制器一起使用时,它会崩溃.

我的项目使用ARC,我将文件标记为-fno-objc-arc.这是源代码:

https://github.com/lifesaglitch/ScratchWithError

当我按下视图控制器,然后弹出,然后重新进入时崩溃.

编辑:

当您将all转换为arc,并将使用临时视图的视图控制器标记为-fno-objc-arc时,它可以正常工作.但是当您将临时视图标记为-fno-objc-arc时,它会再次崩溃.我的项目使用arc,我不认为我可以将自己的视图控制器转换为-fno-objc-arc.

编辑2:

我将初始化代码修改为:

    scratchable = CGImageRetain([UIImage imageNamed:@"scratchable.jpg"].CGImage);
Run Code Online (Sandbox Code Playgroud)

它不再崩溃,但是有内存泄漏.并且在dealloc方法中调用CGImageRelease一次.

All*_*ian 4

使用CGImageCreateCopy

这样做的原因是你向你发送了一个版本CGImageRefdealloc但是如果你检查实际的CGImage对象,你会发现它每次都指向相同的内存地址(我猜这是Apple优化的一部分,所以它就像你一样将有一个static UIImage对象并引用它CGImage)。

所以在你的文件中initWithFrame:你应该像这样得到你的可刮擦:

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

PS:您确实发生了泄漏pixels,因此您还需要CFRelease(pixels);

我测试、分析和测量了代码,现在看起来没问题了。

这里还有一个固定项目的链接(我还放置了一个导航控制器和一个用于推送/弹出的按钮) - 当然使用 ARC。