我知道swift 3中的强(默认)和弱(弱关键字)引用,但有相同的共享引用吗?
由于
答案 0 :(得分:4)
Swift中的内存管理范例与C ++不同,因为它从Objective-C继承了保留释放机制(通过ARC)。正如您所料,C ++的解决方案对编译器的责任较小,表达性和优化性更强,但使用起来也更复杂。
因此,要回答您的问题:strong
(默认情况下)基本上与shared_ptr
类似,weak
类似于weak_ptr
而unique_ptr
没有&#39} ; t有一个直接的等价物。但是,如果编译器能够保证指针的唯一性,那么一些强大的变量可能就像unique_ptr
一样(例如,你创建并销毁同一范围内的对象 - 就像函数体的一样 - 没有指定它任何var)
当然,这仅适用于参考类型。值类型只是被复制。
答案 1 :(得分:2)
普通 vars (没有弱修饰符或无符号修饰符)具有与shared_ptr类似的语义。
答案 2 :(得分:2)
Swift应用强引用的ARC (automatic reference counting)来决定何时释放引用类型实例使用的内存(即,当强引用的数量为那个对象是零)。 ARC及其引用计数自动运行,但与C ++ public static void main(String[] args)
{
Map<Person, List<Pet>> map ; {
map = new HashMap<>();
map.put(new Person("JOHN", 10, "MALE"),
Arrays.asList(new Pet[]{new Pet("Spot", 3, "Dog")}));
map.put(new Person("AISEC", 12, "MALE"),
Arrays.asList(new Pet[]{new Pet("Loo", 12, "Cat"), new Pet("Kitty", 4, "Cat")}));
}
try {
// serialize map into String
String serializedDict = dictToJson(map);
// write to file ...
System.out.println(serializedDict);
map.clear();
// de-serialize from String to map
map = jsonToDict(serializedDict);
// check if map was built ok
System.out.println(dictToJson(map));
} catch (Exception e) {
e.printStackTrace();
}
}
的显式使用有相似之处;后者将允许(通过共享的ptrs)指向的对象仅在指向对象的所有智能指针超出范围或已明确重置(/无效)时被销毁(例如,由提供的deletor)。
在上面的示例中,您可以将强不可变(引用)std::shared_ptr
和foo
(后者从bar
返回)视为foobar()
的等价物C ++:它们都指向相同的std::smart_ptr
对象,并且只有当两者都超出范围时才会取消对象的初始化。
Foo