疑惑:
1、内存管理:dealloc之后还能打印出retainCount = 1
main方法中:
person方法中覆写的dealloc方法和打印结果
2、 两个 category都只覆写了dealloc方法,用来输出验证
Copy创建的对象release之后调用dealloc方法,但是在自动释放池释放对象时,又释放了一次
为什么会释放两次啊?
3、使用类名方法创建对象,引用计数为2
阿神2017-04-24 09:14:06
特別なメロンの種の答えは正しいです。
NSMutableArray
オブジェクトで copy
を呼び出すと NSArray オブジェクトが返されるため、[array4 release]
が呼び出されたときに array4 の dealloc メソッドが呼び出されます。 NSArray dealloc
を出力します。
その後、autoreleasepool が破棄され、array3 が解放され、array3 の dealloc メソッドが呼び出されます。 NSMutableArray の dealloc メソッド内で [super dealloc]
が呼び出されるため、次の 2 つの文が出力されます。 NSMutableArray
对象调用copy
返回的是一个NSArray对象,所以在[array4 release]
被调用时array4的dealloc方法被调用,输出NSArray dealloc
。
随后autoreleasepool被销毁,array3被释放,array3的dealloc方法被调用,因为NSMutableArray的dealloc方法中调用了[super dealloc]
,所以输出了随后的两句。
根据StackOverflow上的回答,这是因为NSArray是一个不可变对象,而由[NSArray array]
或者[[NSArray alloc] init]
生成的都是不可变的空数组,所以苹果默认所有不可变空数组的引用都指向一个唯一实例以进行优化,所以在[NSArray array]
之前,这个实例的retainCount就是1了。在代码中不论是[NSArray array]
或者[[NSArray alloc] init]
都会增加此空数组实例的引用计数。
以下代码可以比较直观的体现这一点,与a
无关的[NSArray array]
语句增加了a
[NSArray array]
または [[NSArray alloc] init]
によって生成されるものは不変の空の配列。そのため、Apple は最適化のために一意のインスタンスを指す不変の空の配列へのすべての参照をデフォルトにするため、[NSArray array]
より前では、このインスタンスの保持Count は 1 です。コードでは、[NSArray array]
であっても [[NSArray alloc] init]
であっても、この空の配列インスタンスの参照カウントが増加します。 🎜🎜
🎜次のコードは、これをより直感的に反映できます。a
とは関係のない [NSArray array]
ステートメントは、a
の参照カウントを増やします。 。 🎜
リーリー
🎜 ARC がオンになっていない場合、メモリ管理は Apple ドキュメントの基本的なメモリ管理ルールにある 4 つの「黄金律」に従うだけで済みます。 🎜PHP中文网2017-04-24 09:14:06
最初の質問に答えてください
オブジェクトのメモリは出力中に再利用されました。
リサイクルされたオブジェクトに retainCount
メッセージを送信する場合、そのオブジェクトが占有しているメモリを再利用すると、プログラムが異常終了する可能性があります。 retainCount
消息,输出结果应该是不确定的,如果该对象所占内存被复用了,有可能会造成程序异常崩溃。
为什么这个不确定的值是1而不是0?因为最后一次执行release
时,系统知道马上要回收内存,就没必要将retainCount
この不定値が 0 ではなく 1 なのはなぜですか?前回 release
が実行されたとき、システムはメモリがリサイクルされることを認識していたので、retainCount
を 1 つ減らす必要はありませんでした。 1 減算されたかどうかに関係なく、必ずリサイクルされます。
この値を 1 から 0 に変更しないと、メモリ操作が 1 回削減され、オブジェクトのリサイクルが高速化されます。
結論: 解放されたオブジェクトにはメッセージを送信しないでください。