【问题标题】:Ownership regarding to returned Quartz objects关于返回的 Quartz 对象的所有权
【发布时间】:2010-05-25 04:04:59
【问题描述】:

我最近询问了关于自动释放返回的石英对象的问题: Autorelease for CGMutablePathRef?

Dave DeLong 回答了我的问题,即石英(或任何 NS 基础对象)没有自动释放,我应该使用 Create Rule。但是文档上的命名约定说,

Core Foundation 命名约定,尤其是“create”一词的使用,仅适用于返回 Core Foundation 对象的 C 函数。 Objective-C 方法的命名约定由 Cocoa 约定控制,无论该方法返回的是 Core Foundation 还是 Cocoa 对象。

由于我的函数是目标 C 对象中的消息,因此将其命名为 createSomething 似乎并不合适。我仍然想返回这个对象。解决这个问题的最佳方法是什么?我应该使用Get Rule,然后让调用者明确保留它吗?但这不在 Cocoa 约定范围内。处理这个问题的正确方法是什么?

【问题讨论】:

  • 当我说 CF 对象没有自动释放时,实际上没有,除非您可以免费将它们连接到 Cocoa 对象。只是为了消除混乱。 :)
  • 谢谢。这让我想知道演员在下面到底做了什么。

标签: objective-c quartz-graphics


【解决方案1】:

通常你应该从一个返回一个新对象的 Objective-C 方法中返回一个自动释放的对象。使用 Core Foundation 对象很容易做到这一点。以这个基本的类方法为例:

+ (CFURLRef)appleWebsiteURL
{
    CFURLRef url = CFURLCreateWithString(NULL,CFSTR("http://apple.com"),NULL);
    return (CFURLRef)[NSMakeCollectable(url) autorelease];
}

请注意,上面的代码将在垃圾收集和引用计数环境中工作。如果您使用的是 iPhone,您可能需要执行以下操作:

return (CFURLRef)[(NSObject*)url autorelease];

【讨论】:

  • 你的意思是自动释放在转换为 NSObject * 后可用并且当你转换回来时它仍然可以工作?
  • 是的。 Core Foundation 对象可以自动释放。
猜你喜欢
  • 1970-01-01
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多