【问题标题】:Objective-C autoreleasepool directive effect variables outside scope.Objective-C autoreleasepool 指令影响范围之外的变量。
【发布时间】: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 ?)
    }
}

【问题讨论】:

    标签: objective-c nsautoreleasepool


    【解决方案1】:

    不,你不需要。根据规则,如果您通过以下方式之一增加其保留计数,则只需释放变量:

    1. 通过 new 或 alloc/init 初始化。
    2. 通过副本复制。
    3. 通过保留增加保留计数。

    如果您通过上述方式以外的任何方式获取变量,则您不拥有它,因此您不需要释放它。

    [NSString stringWithUTF8String:path.c_str()] 返回的字符串是自动释放的字符串。一旦当前运行循环完成,它将被释放。所以你不需要释放它。

    【讨论】:

    • 但是nsPath 是根据path.c_str() 使用方法NSString stringWithUTF8String 设置的,我不确定它是否在后台执行复制...
    • 返回自动释放的 NSString 对象。所以再次按照规则,你不需要释放它。
    • 好的,谢谢...也许您知道如果表达式[NSString stringWithUTF8String:path.c_str()] 的返回值为NULL 会发生什么... ARC 是否也处理这种情况?
    • 如果由于某种原因它为零,则没有对象。没有对象就没有记忆。
    • “一旦你当前的函数退出它就会自动释放” - 不幸的是这是不正确的。在 ARC 下,当当前自动释放池被清空时,对象将被释放要么,并且系统默认池在运行循环的每次迭代结束时被清空; 如果 ARC 确定这是可能的,则更早,虽然这可能在当前函数的末尾,但绝对不可能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    相关资源
    最近更新 更多