8

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

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

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

4

3 回答 3

4

使用CGImageCreateCopy.

这样做的原因是您向您的CGImageRefat发送了一个版本dealloc,但是如果您检查实际CGImage对象,您会发现它每次都指向相同的内存地址(我猜这是 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);

我对代码进行了测试、分析和测量,现在似乎可以了。

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

于 2013-06-10T08:28:10.173 回答
1

这个对我很有用https://github.com/moqod/iOS-Scratch-n-See

于 2014-02-05T21:37:56.093 回答
0

在 AppDelegate.m

   [window addSubview:viewController.view];

您应该将其替换为:

   [window setRootViewController:viewController];
于 2015-10-12T04:32:21.017 回答