gpt4 book ai didi

iphone - 如何在 ARC 模式下验证引用计数?

转载 作者:IT王子 更新时间:2023-10-29 07:43:37 26 4
gpt4 key购买 nike

我曾经在调试器下使用 [myVar retainCount] 来验证我的一些变量是否具有预期的保留计数,尤其是对于没有自定义 dealloc 的 var。

如何在 ARC 模式下执行此操作?如何确保没有内存泄漏?

注意:我知道 ARC 应该为我处理这个问题,但生活远非完美,在现实生活中你有一些对象有时由第三方库分配(使用保留?)并且永远不会被释放。

我这样做的图片:

MyObj *myObj=[[MyObj alloc] init];

然后我打电话

[somethingElse doSomethingWithMyObj:myObj];

后来,我做了

myObj=NULL;

如果我的程序运行良好,我的预期是 myObj 正在被销毁,但事实并非如此......

那么我该如何跟踪它,尤其是当 somethingElse 不是由我管理时?

现在,关于工具:如果不重新启动 mac 并从头开始,似乎很难在我的 mac(5 Meg)上运行内存工具。这真的很烦人!程序还没开始,仪器就一直死机,有什么替代方案吗?

最佳答案

即使在 ARC 下,您也可以对 Objective-C 对象使用 CFGetRetainCount:

NSLog(@"Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)myObject));

虽然这对调试不是特别有用,for reasons amply described elsewhere .如果您需要了解对象的保留和释放位置,请查看 this answer寻求使用分配工具的帮助。

我发现检查保留计数实际有用的唯一情况是在 dealloc 方法中,当某些东西保留并自动释放被释放的对象时。当自动释放池被耗尽时,这将导致稍后崩溃。您可以通过检查每条消息前后的保留计数来查明此问题的原因。通过这种方式我发现the observationInfo method (它本身通常只对调试有用)保留和自动释放 self。然而,即使是这种问题通常也可以在不检查保留计数的情况下解决,只需将 dealloc 的整个主体包装在 @autoreleasepool block 中即可。

但是,保留计数可以用来了解一些类的实现。 (这样做只是为了娱乐或好奇!切勿依赖生产代码中未记录的实现细节!)

例如,立即在 main@autoreleasepool 中尝试这个:

NSNumber *n0 = [[NSNumber alloc] initWithInt:0];
NSLog(@"0 reference count = %ld", CFGetRetainCount((__bridge CFTypeRef)n0));
// Prints 2 in my test

因此 NSNumber 可能会缓存(或至少重用)一些实例。但不是其他人:

n0 = [[NSNumber alloc] initWithInt:200];
NSLog(@"n0 reference count = %ld", CFGetRetainCount((__bridge CFTypeRef) n0));
// Prints 1 - I am the sole owner of this instance. There could be weak
// or unretained references to it, but no other strong references.

NSNumber *n1 = [[NSNumber alloc] initWithInt:200];
NSLog(@"n1 reference count = %ld", CFGetRetainCount((__bridge CFTypeRef) n1));
// Prints 1 again. New instance with same value as prior instance.
// You could of course compare pointers to see that they are separate
// instances.

如果您alloc 但不初始化,您甚至会发现 NSNumber 返回单例:

n1 = [NSNumber alloc];
NSLog(@"n1 reference count = %ld", CFGetRetainCount((__bridge CFTypeRef) n1));
// Prints -1.

(请注意,您还可以通过查看 Core Foundation 源代码了解有关 NSNumber 的许多详细信息,该源代码位于 http://opensource.apple.com。但是谁知道如果您查看保留未与 Core Foundation 中的对象免费桥接的对象的数量?)

关于iphone - 如何在 ARC 模式下验证引用计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8863269/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com