例如,这会泄漏吗?
static std::tuple<CGSize, NSURL *> getThumbnailURL() {
return std::make_tuple(CGSizeMake(100, 100), [NSURL URLWithString:@"http://examples.com/image.jpg"]);
}
答案 0 :(得分:2)
不,它不会泄漏。 NSURL对象将由ARC正确管理。
http://clang.llvm.org/docs/AutomaticReferenceCounting.html#template-arguments
如果模板类型参数的模板参数是没有显式所有权限定符的可保留对象所有者类型,则将其调整为具有__strong限定条件。
std::tuple<CGSize, NSURL *>
与std::tuple<CGSize, NSURL __strong *>
相同。因此,当std :: tuple实例被破坏时,将释放NSURL对象。
答案 1 :(得分:2)
是的,他们的工作。 STL容器是模板化的(STL =标准模板库),所以无论何时使用它,就好像你用(模板实例化)中替换的模板参数重新编译它们的源代码一样。如果您使用替换的模板参数重新编译其源代码,那么ARC将执行该代码中托管指针类型所需的所有适当的内存管理。
另一种思考方式是ARC托管指针类型实际上是C ++智能指针类型 - 它们有一个构造函数,将其初始化为nil
,一个赋值运算符,它释放现有值并保留(或者用于块类型,副本)新值,以及释放值的析构函数。因此,就像STL容器使用类似的C ++智能指针类型一样,它们也可以使用ARC托管指针类型。