是否需要释放[NSFont systemFontOfSize]内存

时间:2011-11-27 04:59:06

标签: objective-c macos cocoa

我正在尝试降低应用程序在运行时使用的内存占用空间....

在根据系统字体大小获取字体的标准用法中,api用作font = [NSFont systemFontOfSize]

+ (NSFont *)systemFontOfSize:(CGFloat)fontSize; // Aqua System font

根据我的理解,font将被自动释放池释放,首先我需要确认这种低估是否正确?

如果这是正确的,那么如果我有一个drawWithFrame函数,我每次绘制一个单元格时都会使用它。我不应该在那里发布吗?并且会增加应用程序的内存占用量,因为在调用应用程序自动释放池时会释放字体吗?

现在又是这种理解是对的吗?有两种方法

  • 找到释放NSFont的方法
  • 放一个NSAutoReleasePool *pool。在框架
  • 中绘制/释放它自己

你们有什么建议?

4 个答案:

答案 0 :(得分:2)

函数名systemFontOfSize:不以任何魔术关键字“alloc”,“new”,“copy”或“mutableCopy”开头,因此您不负责释放它返回的内容。有关详细信息,请参阅Cocoa basic memory management rules

答案 1 :(得分:0)

与返回对象的大多数非“init”方法一样(“复制”是一个突然出现的异常)systemFontOfSize返回的对象是自动释放的,因此它将在(非常接近)的某个时刻释放将来

如果要使用本地范围之外的变量“font”指向的对象,则应保留它并在不再需要时(或在被其他字体替换之前)将其释放

编辑:我刚刚重读,意识到你每次都在创建字体,所以第2段与你的问题没那么相关,但无论如何,除非字体是必须每秒多次改变的东西,我要考虑在drawrect方法之外创建字体对象。我不知道这对你当前的FPS /响应能力有多大的实际影响,但通常很好习惯在循环中多次多次执行对象创建等事情。

答案 2 :(得分:0)

这两个项目都是正确的。按照惯例,所有命名的初始值设定项都返回自动释放的对象。由于您(drawWithFrame的范围)没有明确地分配font,因此您不负责释放它。就像你也建议的那样,可以通过在它周围放一个autorelease池来优化它 是否有利于编码器的额外打字工作是值得商榷的。

答案 3 :(得分:0)

我不习惯处理Font,所以我可能会不在处理。

但是对我来说,如果你经常需要和反对,我会把它缓存在一个属性中 创建和删除比阅读属性更昂贵。

如果这是您课程的一个重要特征,我会在课程的init中创建它。 这将节省不必要的测试,看它是否已经存在。