1

我有自定义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;
 }
4

2 回答 2

6

一般规则是,如果调用名称中包含“Create”或“Copy”的函数,则必须释放它返回的对象。这称为“创建规则”。

您使用名称中嵌入了“创建”的函数创建了渐变。这意味着您负责释放渐变。您可以使用CGGradientReleaseCFRelease

您可以在Core Foundation 的内存管理编程指南中阅读有关创建规则和其他内存管理约定的信息。

您还可以阅读Quartz 2D 编程指南:内存管理:对象所有权

更新

根据您的新代码示例,我现在看到您需要了解另一种内存管理约定。;^)

Objective-C 方法使用与 Core Foundation 函数略有不同的命名约定。Objective-C 方法的约定不是在名称中添加“Create”或“Copy”,而是名称必须以“alloc”、“new”、“copy”或“mutableCopy”开头,如果它返回一个对象调用者必须释放。(您可以在此处阅读有关 Objective-C 内存管理约定的信息。

将您的方法名称从更改为makeGradient:newGradient:分析器将停止抱怨。我测试过了!:^)

于 2012-08-08T06:10:25.150 回答
1

CGGradientRelease简单地说。

于 2012-08-08T06:07:35.427 回答