ios刮刮卡效果崩溃

时间:2013-06-08 05:16:40

标签: iphone ios core-graphics

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

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);

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

3 个答案:

答案 0 :(得分:4)

使用CGImageCreateCopy

原因是您在CGImageRefdealloc发送了一个版本,但如果您检查实际的CGImage对象,则会看到它指向<{1}} em>相同的内存地址每次(我猜这是Apple优化的一部分,所以就像你有一个static UIImage对象并引用它的CGImage)。

所以在你的initWithFrame:中,你应该像以下一样抓住它:

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

PS:您的pixels实际泄密,因此您还需要CFRelease(pixels);

我测试,分析并测量了代码,现在似乎没问题。

Here is also a link to the fixed project(我还放了一个导航控制器和一个按钮来推/弹) - 当然也使用ARC。

答案 1 :(得分:1)

答案 2 :(得分:0)

在AppDelegate.m中

   [window addSubview:viewController.view];

您应该将其替换为:

   [window setRootViewController:viewController];