首页 > 解决方案 > Objective-C autoreleasepool 指令影响范围之外的变量。

问题描述

假设我将 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-cnsautoreleasepool

解决方案


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

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

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

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


推荐阅读