gpt4 book ai didi

ios - 了解内存管理保留计数

转载 作者:行者123 更新时间:2023-11-28 19:46:02 25 4
gpt4 key购买 nike

我在 MyClass.h 中有一个即时变量“obj1”。

@property (nonatomic, retain) NSMutableArray *arrObj1;

在 MyClass.m viewDidLoad 方法中,我分配了另一个对象“obj2”并将其分配给 obj1。

 - (void)viewDidLoad {
[super viewDidLoad];
NSMutableArray *arrObj2 = [[NSMutableArray alloc] initWithObjects:@"a",@"b",@"c", nil];
NSLog(@"arrObj2 count %lu",(unsigned long)[arrObj2 retainCount]);
self.arrObj1 = arrObj2;

NSLog(@"arrObj1 count %lu",(unsigned long)[self.arrObj1 retainCount]);
NSLog(@"arrObj2 count %lu",(unsigned long)[arrObj2 retainCount]);
}

这是输出

2015-08-19 11:06:14.461 MyClass[1812:24133] arrObj2 count 1
2015-08-19 11:06:16.332 MyClass[1812:24133] arrObj1 count 2
2015-08-19 11:06:17.327 MyClass[1812:24133] arrObj2 count 2

我不明白 arrObj2 如何获得保留计数值 2。请解释一下。

谢谢

最佳答案

与您的问题更相关的问题是:为什么 arrObjarrObj2 似乎共享属性?答案是它们是对同一对象 的两个引用。这意味着同一个数组在同一个地方被强引用;也就是说,arrObj1arrObj2 实际上是同一个数组。这就是您看到 retainCount 为 2 的原因,尽管您不应该为此使用 retainCount。 (稍后会详细介绍。)而是在调试器中比较数组的地址;他们将是一样的。如果您将一个对象添加到一个数组,它将被添加到“另一个”。

您可以通过在属性声明上使用复制来解决这个问题,或者将 self.arrObj1 = arrObj2 更改为 self.arrObj1 = [arrObj2 mutableCopy] 。 (编辑:我不确定将属性类型更改为 copy 在这里是否有帮助,因为它是可变类型。不过,如果它只是一个 NSArray,它会起作用。)

我希望这能回答您的问题,但现在我想解释为什么这个问题是错误的。请不要生气,因为学习这一点很重要而且不容易。 :)

考虑关系类型,而不是保留/释放

您根本不应该考虑保留计数,而应该考虑strongweak 关系:strong 关系表示对对象的所有权权益, 关系不会,并且在删除对象的所有所有权权益后不久将转换为 nil。另外,请注意 retain 属性类型已弃用:在 ARC 代码中它应该是 strong

不要使用retainCount

不要使用 retainCount。或者,如果您愿意,When to use Retain Count :

Never.

然后是 Apple 的 official documentation ,开始于:

This method is of no value in debugging memory management issues.

或者有 this from bbum ,我认为更好。他详细介绍了为什么 retainCount 没用,最后说:

Bottom line: the only time the absolute retainCount can be conclusively used for analytic purposes is if you have the backtrace of every retain and release that contributed to the current retain count’s value (there is another use case, documented at the end). If you have that, then you don’t need the retain count and, fortunately, Instruments is already generally quite adept at producing a per-object inventory of retains and releases for you.

基本上,它的值(value)是没有用的。它会返回(在某些情况下)一个对象被保留而不释放的次数。它不会(也不能)考虑它被自动释放的次数。即使不考虑自动释放,它也不会总是返回“正确”的值,因为有些对象永远无法从 RAM 中释放。

关于ios - 了解内存管理保留计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32087394/

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