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)));
}
在Objective C引用计数打印中为1和1
为什么参考计数在目标c 和 swift 中有所不同?
答案 0 :(得分:5)
永远不会你可以依赖具有特定绝对值的保留计数。即使在Objective-C中ARC之前的几天,您也无法将保留计数归结为任何真正意义。你所关心的只是你匹配你写的retain
和release
的数量,如果你保留的对象超过你释放的对象,你就拥有了它,因此它不会消失
如果某个对象在它应该执行之前消失或者在它应该没有消失时有问题,则应该使用对象分配分析工具来查找问题,而不是打印出保留计数。保留计数只是一个实现细节。它甚至可能在将来完全消失。
在上述两种情况中,Swift和Objective-C都在幕后做你不了解或不应该关心的事情。这两个数字都是正确的。