- 不要等到明天,明天太遙遠(yuǎn)能犯,今天就行動。
須讀:看完該文章你能做什么踩晶?
知道什么是MRC、ARC术吝。
能夠清晰的知道單個對象的內(nèi)存管理茸苇。
dealloc方法的重寫樣式以及注意點(diǎn)
學(xué)習(xí)前:你必須會什么?(在這里我已經(jīng)默認(rèn)你具備C語言的基礎(chǔ)了)
什么是引用計數(shù)器
一、本章筆記
一学密、Xcode4.2之后就是ARC了
二、ARC 和 MRC
ARC : automatic(自動) Reference(引用) Counting(計數(shù)) 80%企業(yè)使用
什么是自動引用計數(shù)?
不需要程序員管理內(nèi)容,編譯器會 在適當(dāng)?shù)牡胤?自動給我們添加 release/retain等代碼
注意點(diǎn) : OC中的ARC 和 Java中的垃圾回收機(jī)制不太一樣,Java的垃圾回收是系統(tǒng)干的幔翰,而OC中的ARC 是編譯器干的
MRC : Manul(手動) Reference(引用) Counting(計數(shù)) // 11、12年開發(fā)的時候
什么是手動引用計數(shù)?
所有對象的內(nèi)容 都需要我們手動管理,需要程序員 自己編寫 release / retain等代碼
三遗增、如何修改項目為MRC
項目 -> Build Settings -> 搜索 automatic -> 找到 APPle Objective-C Automatic Reference Counting 設(shè)置為 NO即可
四款青、retain、release、retainCount蔗坯、dealloc
retain : 引用計數(shù)器 + 1
release : 引用計數(shù)器 -1 (注意 : release 僅僅是計數(shù)器 -1 , 并不代表銷毀/回收對象)
retainCount : 計算一個對象的當(dāng)前的引用計數(shù)器 (獲取的數(shù)據(jù) 有可能不正確)
dealloc : 對象引用計算器 為 0的時候 就會調(diào)用類里面的dealloc方法 (注意:在重寫dealloc方法的時候 [super dealloc] 一定要寫到所有代碼的最后)
內(nèi)存管理的原則 就是有加有減
也就是說, 一次alloc 對應(yīng) 一次 release , 一次retain 對應(yīng)一次 release
二燎含、code
main.m
#pragma mark 03-單個對象內(nèi)存管理
#pragma mark 概念
/*
一、Xcode4.2之后就是ARC了
二屏箍、ARC 和 MRC
ARC : automatic(自動) Reference(引用) Counting(計數(shù)) 80%企業(yè)使用
什么是自動引用計數(shù)?
不需要程序員管理內(nèi)容,編譯器會 在適當(dāng)?shù)牡胤?自動給我們添加 release/retain等代碼
注意點(diǎn) : OC中的ARC 和 Java中的垃圾回收機(jī)制不太一樣,Java的垃圾回收是系統(tǒng)干的,而OC中的ARC 是編譯器干的
MRC : Manul(手動) Reference(引用) Counting(計數(shù)) // 11卸奉、12年開發(fā)的時候
什么是手動引用計數(shù)?
所有對象的內(nèi)容 都需要我們手動管理,需要程序員 自己編寫 release / retain等代碼
三颖御、如何修改項目為MRC
項目 -> Build Settings -> 搜索 automatic -> 找到 APPle Objective-C Automatic Reference Counting 設(shè)置為 NO即可
四、retain潘拱、release、retainCount芦岂、dealloc
retain : 引用計數(shù)器 + 1
release : 引用計數(shù)器 -1 (注意 : release 僅僅是計數(shù)器 -1 , 并不代表銷毀/回收對象)
retainCount : 計算一個對象的當(dāng)前的引用計數(shù)器 (獲取的數(shù)據(jù) 有可能不正確)
dealloc : 對象引用計算器 為 0的時候 就會調(diào)用類里面的dealloc方法 (注意:在重寫dealloc方法的時候 [super dealloc] 一定要寫到所有代碼的最后)
內(nèi)存管理的原則 就是有加有減
也就是說, 一次alloc 對應(yīng) 一次 release , 一次retain 對應(yīng)一次 release
*/
#pragma mark - 代碼
#import <Foundation/Foundation.h>
#pragma mark 類
#import "Person.h"
#pragma mark - main函數(shù)
int main(int argc, const char * argv[])
{
@autoreleasepool {
// 只要創(chuàng)建一個對象 默認(rèn)引用計數(shù)器的值就是1
Person *p = [[Person alloc]init];
NSLog(@"retain count = %lu",[p retainCount]);
// 只要給對象 發(fā)送一個 retain消息, 對象的引用計數(shù)器 就會 + 1
[p retain];
NSLog(@"retain count = %lu",[p retainCount]);
// 通過 指針變量p,給p指向的對象 發(fā)送一條release消息
// 只要對象 接收到 release消息, 引用計數(shù)器就會-1
[p release]; // release , 并不代表銷毀/回收對象, 僅僅是計數(shù)器-1
NSLog(@"retain count = %lu",[p retainCount]);
[p release];
NSLog(@"---");
}
// [p setAge:20];
return 0;
}
Person
>>>.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
@end
>>>.m
#import "Person.h"
@implementation Person
- (void)dealloc
{
NSLog(@"Person dealloc");
// 注意 : super dealloc 一定要寫到所有代碼的最后
// 一定要寫在 dealloc方法 的最后面
[super dealloc];
}
@end
Person的內(nèi)存分析
一杠茬、設(shè)置項目為MRC
一弛随、官方對retain、release舀透、retainCount、dealloc的截圖