joh*_*ers 1 core-graphics objective-c quartz-graphics uikit quartz-2d
我有自定义UIView绘图drawRect.
我不太了解C API,所以我不确定它们需要什么内存规则.Objective-C规则非常简单,并声明您通过init retain或者copyC语言功能CGGradientCreateWithColorComponents不是Objective-C而释放您拥有的任何内容,而产品>分析报告它是潜在的泄漏.
是否有必要发布此功能的结果,如果是,如何?一般来说,当涉及到这些API时,有没有简单的方法来了解函数是否正在分配您需要手动释放的内存?
更新:这是代码,感谢到目前为止答案中的信息.我现在收到incorrect decrement错误:
CGGradientRef theGradient=[self makeGradient:YES];
//do something with theGradient in my drawing
CGGradientRelease(theGradient); // this line Analyze says incorrect decrement of object not owned by caller
Run Code Online (Sandbox Code Playgroud)
在makeGradient我有:
- (CGGradientRef)makeGradient:(BOOL)red{
CGGradientRef gradient;
//create my gradient
return gradient;
}
Run Code Online (Sandbox Code Playgroud)
一般规则是,如果调用名称中包含"Create"或"Copy"的函数,则必须释放它返回的对象.这称为"创建规则".
您使用名称中嵌入了"创建"的函数创建了渐变.这意味着你负责释放渐变.你可以使用CGGradientRelease或CFRelease.
您可以在"Core Foundation内存管理编程指南"中了解"创建规则"和其他内存管理约定.
您还可以阅读Quartz 2D Programming Guide:Memory Management:Object Ownership.
根据您的新代码示例,我现在看到您需要了解另一个内存管理约定.; ^)
Objective-C方法使用与Core Foundation函数略有不同的命名约定.Objective-C方法的约定不是在名称中放置"Create"或"Copy",而是如果返回一个对象,则名称必须以"alloc","new","copy"或"mutableCopy"开头.调用者必须释放.(您可以在此处阅读Objective-C内存管理约定.)
将方法名称从更改makeGradient:为newGradient:,分析仪将停止抱怨.我测试过了!:^)
| 归档时间: |
|
| 查看次数: |
976 次 |
| 最近记录: |