我需要在我的游戏中使用划痕效果。以下是几年前的示例代码。
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确实被调用过一次。
发布于 2013-06-10 16:28:10
使用CGImageCreateCopy。
这样做的原因是你在dealloc上给你的CGImageRef发送了一个版本,但是如果你检查实际的CGImage对象,你会发现它每次都指向相同的内存地址(我猜这是苹果优化的一部分,所以就像你有一个static UIImage对象并引用了它的CGImage一样)。
所以在你的initWithFrame:中,你应该像这样得到你的scratchable:
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。
发布于 2014-02-06 05:37:56
发布于 2015-10-12 12:32:21
在AppDelegate.m中
[window addSubview:viewController.view];您应该将其替换为:
[window setRootViewController:viewController];https://stackoverflow.com/questions/16996351
复制相似问题