我似乎到处都找不到答案。我在iOS的Objective-C开发中使用了手动内存管理。
我写了一个方便的函数,用于从十六进制字符串中获取UIColor。在其中,它返回
[[UIColor alloc] initWithRed:... alpha:alpha]显然,在某些平台上(我们有一些设备,范围在iOS 8-9),对象会在退出函数时被销毁,因此它返回的UIColor*无法使用。现在,我们将其更改为
[[[UIColor alloc] initWithRed:... alpha:alpha] retain]我的问题是,当我使用完这个对象后,我必须释放它两次吗?一次用于分配,一次用于保留?这对我来说似乎很奇怪,而且我在任何地方都找不到它。
如果我不保留,它会在退出函数时被取消分配(在某些平台上),使函数变得无用。如果我保留了,我需要在完成后释放两次?
编辑:
"...,通常保证它在接收它的方法或函数内保持有效。如果希望它在该作用域之外保持有效,则应保留或复制它。“
所以我没有做任何不寻常的事。文档说,如果“我希望它在函数的作用域之外保持有效”,我就“应该保留它”。我会试试@FreeNickname建议的。这是最有意义的。
发布于 2016-06-04 23:33:01
我认为你正在寻找autorelease的概念,它被用于像你这样的情况。它本质上是一种将延迟的release消息发送到新创建的对象的方法,以便调用者有机会在必要时对其执行retain操作,否则在处理autoreleasepool时会将其销毁。
发布于 2016-06-05 12:57:54
你“误解了”苹果的文档,因为对于这个主题,它是完全错误的。你真的应该阅读clang的ARC文档,而不是Apple的文档,因为clang的ARC文档正确地解释了MRC,以便与之交互。
让我们仔细看看:
通过为对象分配内存或复制对象,您可以拥有创建的任何对象。
相关方法:alloc、allocWithZone:、copy、copyWithZone:、mutableCopy、mutableCopyWithZone:
…
相反,如果您不是对象的创建者,并且没有表达所有权兴趣,则不能释放该对象。
…
如果您从程序中的其他地方接收到一个对象,通常可以保证它在接收它的方法或函数中保持有效。
请认真对待本文档,您不是该对象的所有者:
[[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,copyWithZone:)mutableCopy方法必须返回可保留的对象指针类型。(Apple:mutableCopyWithZone:),mutableCopy
new方法必须返回可保留的对象指针类型。(苹果:哦,我忘了一件事)init方法必须是实例方法,并且必须返回Objective-C指针类型。…(苹果:哦,我忘了一件事)(5.)
所以,你从-init得到的东西已经被保留了,你已经拥有了所有权,绝对没有理由保留它。
根据Rob的回答,可能有理由自动释放它。
https://stackoverflow.com/questions/37631918
复制相似问题