Ios 理解内存管理
我试图更好地理解Objective C中的内存管理(没有ARC)。 目前创建简单的程序来尝试使用它 我的代码Ios 理解内存管理,ios,objective-c,memory-management,retain,Ios,Objective C,Memory Management,Retain,我试图更好地理解Objective C中的内存管理(没有ARC)。 目前创建简单的程序来尝试使用它 我的代码 ... //create some object RetainTracker * rt = [RetainTracker new]; //RC=1 NSLog(@"Just created - %lu", (unsigned long)[rt retainCount]); [rt retain]; // RC=2 NSLog(@"%lu", (unsigned long)[rt reta
...
//create some object
RetainTracker * rt = [RetainTracker new]; //RC=1
NSLog(@"Just created - %lu", (unsigned long)[rt retainCount]);
[rt retain]; // RC=2
NSLog(@"%lu", (unsigned long)[rt retainCount]);
[rt release]; //RC=1
NSLog(@"%lu", (unsigned long)[rt retainCount]);
[rt release]; //RC=0 -> call to dealloc
//call to object rt again after it was deallocated and get RC=1
NSLog(@"%lu", (unsigned long)[rt retainCount]); //think that here must be exception ?
结果:
所以,在结果中,我们可以看到,在我释放最后一个引用之后,引用计数器仍然等于1,对于对象rt
我更深入,用仪器调查这个物体的“生命”,得到下一个
据我了解:
- 步骤0-仅创建-RC=1李>
- 步骤1-对于代码
-RC=2李>[rt retain]
- 步骤3-对于代码
-RC=1李>[rt release]
- 步骤4-对于代码
-RC=0李>[rt release]
所以,对象必须被解除分配,但如果在步骤4之后调用
[rt retainCount]
,则该对象的RC仍然等于1。为什么?可能我犯了什么错误或错过了什么?当池中的retain count为0时,对象被释放。释放对象后,该对象可能仍在内存中。尝试在下一次排水后进入,看看会发生什么
更新:
对我的错误。由于某种原因,我错过了它没有自动释放的事实。然而,我在研究retainCount方法时,在文档中发现了这样一个问题:“不要使用此方法(必选)”
下面是:“……你不太可能从这个方法中得到有用的信息”
retainCount方法似乎不能可靠地为您提供对象的retain计数。但是,仍然很奇怪,您甚至可以将该消息发送到假定已释放的对象。当池中的retain count为0时,对象将在池中被释放。释放对象后,该对象可能仍在内存中。尝试在下一次排水后进入,看看会发生什么 更新: 对我的错误。由于某种原因,我错过了它没有自动释放的事实。然而,我在研究retainCount方法时,在文档中发现了这样一个问题:“不要使用此方法(必选)” 下面是:“……你不太可能从这个方法中得到有用的信息”
retainCount方法似乎不能可靠地为您提供对象的retain计数。但是,仍然很奇怪,您甚至可以将该消息发送到假定已释放的对象。当池中的retain count为0时,对象将在池中被释放。释放对象后,该对象可能仍在内存中。尝试在下一次排水后进入,看看会发生什么 更新: 对我的错误。由于某种原因,我错过了它没有自动释放的事实。然而,我在研究retainCount方法时,在文档中发现了这样一个问题:“不要使用此方法(必选)” 下面是:“……你不太可能从这个方法中得到有用的信息”
retainCount方法似乎不能可靠地为您提供对象的retain计数。但是,仍然很奇怪,您甚至可以将该消息发送到假定已释放的对象。当池中的retain count为0时,对象将在池中被释放。释放对象后,该对象可能仍在内存中。尝试在下一次排水后进入,看看会发生什么 更新: 对我的错误。由于某种原因,我错过了它没有自动释放的事实。然而,我在研究retainCount方法时,在文档中发现了这样一个问题:“不要使用此方法(必选)” 下面是:“……你不太可能从这个方法中得到有用的信息”
retainCount方法似乎不能可靠地为您提供对象的retain计数。但是,仍然很奇怪,您甚至可以将该消息发送到假定已释放的对象。在对象解除分配后,使用指向该对象的指针会导致未定义的行为。也就是说,它可以打印1,42,你的程序可能会崩溃,Hello Kitty可能会出现在你的电脑上;任何事情都有可能发生。任何行为都是与未定义的行为一致的,即使是似乎表明正在发生其他事情的行为 除了这是未定义的行为之外,你所看到的很可能是基于你所做的。对象解除分配后,其内存被标记为可供使用,但构成内存中对象的字节仍保留在内存中。因此,在当前时间内,它很可能没有被其他内容覆盖,并且内存仍然“看起来”像被释放的对象,并且向它发送消息(尽管未定义行为)很可能会成功,因为它只是使用对象中仍然在内存中正确位置的部分
关于保留计数,您假设当您
释放它时,保留计数(无论它存储在内存中如何)将始终递减,因此如果在释放之前它是1,之后它应该是0。但是,当retain count为1时,他们不必这样做,因为他们知道当您释放retain count为1的对象时,该对象将被解除分配,之后您无论如何都不应该使用该对象,因此在这种情况下,他们可能会跳过递减,因为更新不再使用的变量没有意义。对象解除分配后,使用指向该对象的指针会导致未定义的行为。也就是说,它可以打印1,42,你的程序可能会崩溃,Hello Kitty可能会出现在你的电脑上;任何事情都有可能发生。任何行为都是与未定义的行为一致的,即使是似乎表明正在发生其他事情的行为
除了这是未定义的行为之外,你所看到的很可能是基于你所做的。对象解除分配后,其内存被标记为可供使用,但构成内存中对象的字节仍保留在内存中。所以在当下