Objective-C autoreleasepool 指令影响范围之外的变量。
Posted
技术标签:
【中文标题】Objective-C autoreleasepool 指令影响范围之外的变量。【英文标题】:Objective-C autoreleasepool directive effect variables outside scope. 【发布时间】:2018-06-10 11:29:45 【问题描述】:假设我将 c++ 函数与 Objective-c 成员结合在一起。
该函数获取std::string
并将其转换为NSstring*
,并在离开之前使用此变量...
我应该期待NSstring*
在autoreleasepool
范围结束时发布吗?
void myclass::myfunc(context& ctx)
@autoreleasepool
std::string path = ctx.getData().path;
NSString *nsPath = [NSString stringWithUTF8String:path.c_str()];
... (do something with nsString, Should it be released after leaving the scope ?)
【问题讨论】:
【参考方案1】:不,你不需要。根据规则,如果您通过以下方式之一增加其保留计数,则只需释放变量:
-
通过 new 或 alloc/init 初始化。
通过副本复制。
通过保留增加保留计数。
如果您通过上述方式以外的任何方式获取变量,则您不拥有它,因此您不需要释放它。
[NSString stringWithUTF8String:path.c_str()]
返回的字符串是自动释放的字符串。一旦当前运行循环完成,它将被释放。所以你不需要释放它。
【讨论】:
但是nsPath
是根据path.c_str()
使用方法NSString stringWithUTF8String
设置的,我不确定它是否在后台执行复制...
返回自动释放的 NSString 对象。所以再次按照规则,你不需要释放它。
好的,谢谢...也许您知道如果表达式[NSString stringWithUTF8String:path.c_str()]
的返回值为NULL 会发生什么... ARC 是否也处理这种情况?
如果由于某种原因它为零,则没有对象。没有对象就没有记忆。
“一旦你当前的函数退出它就会自动释放” - 不幸的是这是不正确的。在 ARC 下,当当前自动释放池被清空时,对象将被释放要么,并且系统默认池在运行循环的每次迭代结束时被清空; 或如果 ARC 确定这是可能的,则更早,虽然这可能在当前函数的末尾,但绝对不可能。以上是关于Objective-C autoreleasepool 指令影响范围之外的变量。的主要内容,如果未能解决你的问题,请参考以下文章