Swift Code
override func viewDidLoad() {
super.viewDidLoad()
var v1 = ViewController()
let v2 = ViewController2()
print("(CFGetRetainCount(v1)) and (CFGetRetainCount(v2))")
}
在 Swift 中,引用计数打印为 2 和 2
目标 C 代码
- (void)viewDidLoad {
[super viewDidLoad];
ViewController *v1 = [[ViewController alloc]init];
ViewController2 *v2 = [[ViewController2 alloc]init];
NSLog(@"%ld and %ld",CFGetRetainCount((__bridge CFTypeRef)(v1)),CFGetRetainCount((__bridge CFTypeRef)(v2)));
}
在物镜 C 中,参考文献计数打印为 1 和 1
为什么目标 c 和 swift 中的引用计数不同?
依赖具有特定绝对值的保留计数。即使在 Objective-C 中的 ARC 之前,您也无法将任何真正的意义归因于保留计数。你所关心的只是你匹配你写的retain
和release
的数量,如果你保留的对象多于你释放它,你就拥有它,因此它不会消失。
在应该消失时没有消失,则应使用对象分配分析工具来查找问题,而不是打印出保留计数。保留计数只是一个实现细节。它甚至可能在未来完全消失。
在上述两种情况下,Swift 和 Objective-C 都在幕后做一些你不知道或不应该关心的事情。这两个数字在上下文中都是正确的。