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刮刮卡效果崩溃的主要内容,如果未能解决你的问题,请参考以下文章