ios刮刮卡效果崩溃

Posted

技术标签:

【中文标题】ios刮刮卡效果崩溃【英文标题】:ios scratch card effect crash 【发布时间】:2013-06-08 05:16:39 【问题描述】:

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

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 方法中被调用过一次。

【问题讨论】:

如果没有崩溃日志或领事的报告,就不可能说出如何修复代码使其不会崩溃,除非有人有水晶球。 @CodeMonkey 相信我,有时应用程序在没有日志的情况下崩溃 这是合乎逻辑的,但是您发布的代码很好,除非您可以重新创建崩溃并查看日志,否则几乎不可能确定问题所在。 @CodeMonkey 我正在尝试,但这次我的模拟器只是挂起。你能做一个简单的项目吗?这真的很简单。我已经提供了下载链接。我只是推一个控制器,弹出它然后重新推 我发现您发布的代码和 github 上的项目没有任何根本性的错误。我的猜测是您没有正确管理内存,这很容易做到,尤其是当您混合使用 ARC 和 MRC 时。我建议您只需花几分钟时间来修改“旧”的可刮擦视图代码,使其符合 ARC,并将 ARC 用于您的整个项目。 【参考方案1】:

使用CGImageCreateCopy

这样做的原因是您在dealloc 向您的CGImageRef 发送了一个版本,但是如果您检查实际的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);

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

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

【讨论】:

【参考方案2】:

这个很适合我https://github.com/moqod/ios-Scratch-n-See!

【讨论】:

【参考方案3】:

在 AppDelegate.m 中

   [window addSubview:viewController.view];

您应该将其替换为:

   [window setRootViewController:viewController];

【讨论】:

以上是关于ios刮刮卡效果崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Android 自己定义控件实现刮刮卡效果 真的就仅仅是刮刮卡么

Swift 3 中的刮刮卡效果

Html5实现移动端PC端 刮刮卡效果

Html5实现移动端PC端 刮刮卡效果

Andriod实现刮刮卡的效果

Android - View之自定义View实现“刮刮卡”效果