OC學習那些事 記憶體管理

2021-08-27 14:26:05 字數 2948 閱讀 8925

1.範圍

任何繼承了nsobject的物件,

對基本資料型別無效。

2.原理

每個物件內部都儲存了乙個與之相關聯的整數,稱為

引用計數器。

當使用alloc、new或者copy

建立乙個物件的時,物件的引用計數器設定為1。

給物件傳送一條

retain訊息

,可以使引用

計數器+1。

給物件傳送一條

release訊息

,可以使引用

計數器-1。

當乙個物件的引用

計數器值為0時

,那麼它將

被銷毀,其占用的記憶體被系統收回。oc也會自動傳送一條dealloc訊息,一般會重寫dealloc方法,在這裡做釋放相關的資源。一定不要直接呼叫dealloc方法。

可以給物件傳送

retaincount訊息

獲取當前的引用計數器值。

3.原則

誰建立,誰釋放

(」誰汙染、誰治理

「)。如果你通過alloc、new或

(mutable)

copy來建立乙個物件,那麼你必須呼叫release和autorelease。換句話說,不是你建立的,就不用你去釋放。

一般來說除了alloc、new或copy之外的方法建立的物件,都宣告了autorelease。

誰retain,誰release。只要你呼叫了retain,無論這個物件是如何生成的,你都要呼叫release。

4.注釋

#pragma mark -分組 

#pragma mark 方法注釋

#pragma mark - 公共方法

#pragma mark 讀書

-(void)readbook

5.set

方法的記憶體管理

1.普通型別:只需要@property

intage;

2.oc

型別:需要@property

book*

book,宣告屬性,實現set方法

(先判斷是否相等,release舊的,retain新的

),在dealloc:方法中release;

-(void)setbook:(book *)book  } 

#pragma mark **物件

- (void)dealloc

6.空指標和野指標

空指標:不報錯

[nil release];

野指標:訪問了不屬於你的記憶體,會報錯。

[sturelease];

//野指標

[stu

release];

7.@property引數

1.讀寫屬性:

readwrite(預設

) readonly:只生成get方法宣告

2.setter處理:

assign(預設)

retain:在setter方法中,release舊值,retain新值

copy:在setter方法,release舊值,copy新值

3.原子性:

atomicity(預設)

atomicity:給方法進行枷鎖,保證多執行緒安全

4.getter/

setter方法:

getter=

isrich

/setter=rich

getter:指定getter方法的方法名

8.自動釋放池(

autorelease

pool)

自動釋放池也是oc裡面一種記憶體自動**機制,一般可以將一些臨時變數新增到自動釋放池中,統一**釋放。

當自動釋放被銷毀的時候,池裡的所有物件,都會呼叫一次release方法。

@autoreleasepool{}:手動建立乙個自動釋放池。 

@autoreleasepool

前 nsautoreleasepool *pool = [[nsautoreleasepool alloc]init];

… …

[pool release];

9.autorelease

oc物件只需要傳送一條autorelease訊息,就會把這個物件新增到最近的自動釋放池中(棧頂的釋放池)。

autorelease實際上只是把release呼叫延遲了,對於每一次autolease,系統只是把該物件放入了當前的autorelease

pool中,當該pool被釋放時,該pool中的所有物件都會呼叫release方法。

10.autorelease

pool注意

在arc下,不能使用

[[nsautoreleasepool

alloc

]init

]建立自動釋放池,應當使用

@autoreleasepool。

不要把大量的迴圈操作放到同乙個

nsautoreleasepool

之間,這樣會造成記憶體峰值上公升。

盡量避免對大記憶體使用該方法,對於這種延遲釋放機制,還是盡量少用。

sdk一般利用靜態方法建立並返回物件都是已經autorelease的,不需要再進行release操作。

OC學習那些事 Category

1.category 概念 oc提供了一種與眾不同的方式 category,可以動態的為已經存在的類新增新的行為 方法,不能新增成員變數 這樣可以保證類的原始設計規模最小,功能增加在逐步擴充套件。使用category對類進行擴充套件時,不需要建立子類。category使用簡單的方式,實現了類的相關方...

OC學習那些事 Protocol

1.procotol 簡單來說就是一系列方法的列表,其中宣告的方法可以被任何類實現。這種模式一般稱為 delegation 模式。在ios和os 2.procotol 的使用 protocol study 預設是 require void test3 required表示必須實現的方法 雖然是必須實...

OC學習那些事 Protocol

1.procotol 簡單來說就是一系列方法的列表,其中宣告的方法可以被任何類實現。這種模式一般稱為 delegation 模式。在ios和os 2.procotol 的使用 protocol study 預設是 require void test3 required表示必須實現的方法 雖然是必須實...