首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要发布两次吗?

需要发布两次吗?
EN

Stack Overflow用户
提问于 2016-06-04 23:26:30
回答 2查看 488关注 0票数 0

我似乎到处都找不到答案。我在iOS的Objective-C开发中使用了手动内存管理。

我写了一个方便的函数,用于从十六进制字符串中获取UIColor。在其中,它返回

代码语言:javascript
复制
[[UIColor alloc] initWithRed:... alpha:alpha]

显然,在某些平台上(我们有一些设备,范围在iOS 8-9),对象会在退出函数时被销毁,因此它返回的UIColor*无法使用。现在,我们将其更改为

代码语言:javascript
复制
[[[UIColor alloc] initWithRed:... alpha:alpha] retain]

我的问题是,当我使用完这个对象后,我必须释放它两次吗?一次用于分配,一次用于保留?这对我来说似乎很奇怪,而且我在任何地方都找不到它。

如果我不保留,它会在退出函数时被取消分配(在某些平台上),使函数变得无用。如果我保留了,我需要在完成后释放两次?

编辑:

https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/MemoryManagement.html

"...,通常保证它在接收它的方法或函数内保持有效。如果希望它在该作用域之外保持有效,则应保留或复制它。“

所以我没有做任何不寻常的事。文档说,如果“我希望它在函数的作用域之外保持有效”,我就“应该保留它”。我会试试@FreeNickname建议的。这是最有意义的。

EN

回答 2

Stack Overflow用户

发布于 2016-06-04 23:33:01

我认为你正在寻找autorelease的概念,它被用于像你这样的情况。它本质上是一种将延迟的release消息发送到新创建的对象的方法,以便调用者有机会在必要时对其执行retain操作,否则在处理autoreleasepool时会将其销毁。

票数 0
EN

Stack Overflow用户

发布于 2016-06-05 12:57:54

你“误解了”苹果的文档,因为对于这个主题,它是完全错误的。你真的应该阅读clang的ARC文档,而不是Apple的文档,因为clang的ARC文档正确地解释了MRC,以便与之交互。

让我们仔细看看:

通过为对象分配内存或复制对象,您可以拥有创建的任何对象。

相关方法:allocallocWithZone:copycopyWithZone:mutableCopymutableCopyWithZone:

相反,如果您不是对象的创建者,并且没有表达所有权兴趣,则不能释放该对象。

如果您从程序中的其他地方接收到一个对象,通常可以保证它在接收它的方法或函数中保持有效。

请认真对待本文档,您不是该对象的所有者:

代码语言:javascript
复制
[[UIColor alloc] initWithRed:... alpha:alpha]

这是因为您没有从+alloc等人那里收到对象引用,而是从-init…那里收到了对象引用。遵循苹果的文档,你不是所有者,必须保留它。(所以它是“别处”。)

在clang的文档中,它是described differently and correctly

init系列中的

方法隐式地使用它们的self参数并返回一个保留的对象。(5.2.1)

因此,对于-init…和苹果文档中提到的其他方法correctly described in clang's documentation,有一个特殊的方法族

族及其添加的限制为:

  • alloc方法必须返回可保留的对象指针类型。[苹果: alloc,allocWithZone:)

  • copy方法必须返回可保留对象指针类型。[苹果:copycopyWithZone:)

  • mutableCopy方法必须返回可保留的对象指针类型。(Apple:mutableCopyWithZone:)

mutableCopy

  • new方法必须返回可保留的对象指针类型。(苹果:哦,我忘了一件事)

  • init方法必须是实例方法,并且必须返回Objective-C指针类型。…(苹果:哦,我忘了一件事)

(5.)

所以,你从-init得到的东西已经被保留了,你已经拥有了所有权,绝对没有理由保留它。

根据Rob的回答,可能有理由自动释放它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37631918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档