【发布时间】:2016-06-04 15:26:29
【问题描述】:
我似乎无法在任何地方找到答案。我在为 iOS 开发的 Objective-C 中使用手动内存管理。
我编写了一个从十六进制字符串中获取 UIColor 的便捷函数。在其中,它返回
[[UIColor alloc] initWithRed:... alpha:alpha]
显然在某些平台上(我们有一些设备,包括 iOS 8-9),该对象将在退出函数时被销毁,因此无法使用其返回的 UIColor*。所以现在,我们把它改成
[[[UIColor alloc] initWithRed:... alpha:alpha] retain]
我的问题是,当我使用完这个对象后,我必须释放它两次吗?一次分配,一次保留?这对我来说似乎很奇怪,我在网上找不到任何地方。
如果我不保留,它会在退出函数(在某些平台上)时被释放,从而使函数无用。如果我保留,我需要在完成后释放两次?
编辑:
"...,通常保证在接收它的方法或函数内保持有效。如果您希望它在该范围之外保持有效,则应保留或复制它。"
所以我没有做任何不寻常的事情。文档说如果“我希望它在函数范围之外保持有效”,我“应该保留它”。我会尝试@FreeNickname 的建议。这是最有意义的。
【问题讨论】:
-
在那些平台上发布两次会崩溃吗?我会尝试使用
[[[[UIColor alloc] initWithRed:... alpha:alpha] retain] autorelease],并将函数返回的UIColor视为“已保留”(应该如此)。但在这种情况下,您必须在其他地方发布它,并且它会被发布两次。真是奇怪的情况。 -
“我在 iOS 的 Objective-C 开发中使用手动内存管理。”我不得不问:为什么?没有必要,而且您显然不知道自己在做什么。使用弧!编译器比你更了解内存管理。
-
"显然在某些平台上......该对象将在退出函数时被销毁,因此无法使用其返回的
UIColor。"不,在手动引用计数中,使用alloc实例化的对象在与相应的release或autorelease配对之前不会被释放。不要随意插入retain语句。如果您对为什么认为需要添加retain有疑问,那么让我们专注于该问题,而不是尝试管理在插入随机retain语句时必须执行的操作。 -
您确实需要更好地解释在哪些特定情况下预期行为未按预期运行。通过
alloc/init创建的对象不仅仅是在某些平台上无缘无故地被神秘地释放。这比你迄今为止提供的更多。专注于实际问题,而不是添加更多问题。 -
不,您根本不需要保留它。
alloc/init已经将保留计数设置为 1。在保留计数变为 0 之前,它不能被释放。假设您真的在使用 MRC,它不会神奇地变为 0,只是离开该方法。而且您的编辑并未尝试执行我在之前的评论中所说的内容。
标签: objective-c memory-management manual-retain-release