我需要为我的游戏使用划痕效果。这是几年前的示例代码。
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一次。
答案 0 :(得分:4)
使用CGImageCreateCopy
。
原因是您在CGImageRef
向dealloc
发送了一个版本,但如果您检查实际的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];