objective-c - 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 ?)
}
}
解决方案
不,你不需要。根据规则,如果您通过以下方式之一增加其保留计数,则仅需要释放变量:
- 通过 new 或 alloc/init 进行初始化。
- 通过复制复制。
- 通过保留增加保留计数。
如果您通过上述方式以外的任何方式获取变量,则您不拥有它,因此您不需要释放它。
通过返回的字符串[NSString stringWithUTF8String:path.c_str()]
是自动释放的字符串。一旦当前运行循环完成,它将被释放。所以你不需要释放它。
推荐阅读
- python - 如何根据特定规则将列从一个数据框添加到另一个数据框
- r - 避免科学记数法x轴ggplot
- algorithm - 使用特定图案平铺三角形网格
- javascript - 使用 angularjs 承诺添加随机数
- java - cassandra使用java驱动读取大量数据
- robotframework - 评估机器人框架中的表达式错误
- excel - 在 Visual Basic 中将文件拆分为数组
- java - 将嵌套对象发送到 Jaspersoft iReport
- rxjs - 有没有办法使用 rxjs switchMap 或类似的,并可选择返回一个 observable
- angular - Angular 5:为什么在调试模式下没有出现“组件是 2 个模块声明的一部分”