我在UIView
中绘制了自定义drawRect
。
我不太了解C API,所以我不确定它们需要什么内存规则。 Objective-C规则非常简单,并说明您通过init
retain
或copy
发布了您拥有的任何内容,但C函数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
在makeGradient
我有:
- (CGGradientRef)makeGradient:(BOOL)red{
CGGradientRef gradient;
//create my gradient
return gradient;
}
答案 0 :(得分:6)
一般规则是,如果调用名称中包含“Create”或“Copy”的函数,则必须释放它返回的对象。这称为“创建规则”。
您使用名称中嵌入了“创建”的函数创建了渐变。这意味着你负责释放渐变。您可以使用CGGradientRelease
或CFRelease
。
您可以在Memory Management Programming Guide for Core Foundation。
中阅读有关创建规则和其他内存管理约定的信息您还可以阅读Quartz 2D Programming Guide: Memory Management: Object Ownership。
根据您的新代码示例,我现在看到您需要了解另一种内存管理约定。 ; ^)
Objective-C方法使用与Core Foundation函数略有不同的命名约定。 Objective-C方法的约定不是在名称中放置“Create”或“Copy”,而是如果返回一个对象,则名称必须以“alloc”,“new”,“copy”或“mutableCopy”开头。调用者必须释放。 (You can read about Objective-C memory management conventions here.)
将您的方法名称从makeGradient:
更改为newGradient:
,分析师将停止投诉。我测试过了! :^)
答案 1 :(得分:1)
简单地使用CGGradientRelease
。