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 指令影响范围之外的变量。的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3.0 令人兴奋,但Objective-C也有小改进--Objective-C的类属性

如何在c++中,调用objective-c

1了解Objective-C语言的起源

Objective-C 和 C++ 的区别有哪些?

Objective-C中的Hello World

C++和Objective-C混编(官方文档翻译)