記憶體管理注意點

2021-07-02 15:13:27 字數 3987 閱讀 6001

記憶體管理問題總結  共54個問題

以問題驅動學習的好處

1.學習效率極其的高

2.能夠清楚的知道,自己那裡會了,那裡不會.(時間)

3.課後寫**練習時目的性很強

4.擅長總結,在面試的時候能夠體現的淋漓盡致,使你面試非常容易

5.方便日後複習

6.只要你能夠把每天的問題都能夠通過自己的總結清晰的搞明白,那麼你的薪水一定是10k以上

**記憶體管理 問題

1.什麼是ios記憶體管理?

就是在物件不再被使用的時候,把它即時的從記憶體中清除掉

2.為什麼要使用記憶體管理?

1.嚴格的記憶體管理,能夠是我們的應用程在效能上有很大的提高

2.如果忽略記憶體管理,可能導致應用占用記憶體過高,導致程式崩潰

3.系統判斷乙個物件是否要被銷毀的依據是什麼?

每個物件建立出來的時候,都有乙個retaincount屬性,預設值是1,當retaincount = 0的時候,系統就會將該對像銷毀

4.如何使物件的retaincount 值增加?

呼叫retain 物件方法

5.如何使物件的retaincount 值減少?

呼叫release 物件方法

6.如何判斷物件已經被銷毀了?

1.從寫nsobject提供的,dealloc方法,當物件即將被銷毀的時候,缺省會呼叫該方法

2.dealloc方法中一定要呼叫[super dealloc]方法

6.1 dealloc這個函式是那裡來呀?

7.記憶體管理原則是什麼?

只要是出現new,alloc,retain,就要配對出現release操作,或者autorelease操作

**單個物件記憶體管理 問題

1.什麼是野指標?

物件的retaincount已經為0,儲存了物件指標位址的變數就是野指標

1.1 使用野指標會有什麼問題?

使用野指標呼叫物件的方法,會導致野指標異常,導致程式直接崩潰

2.什麼是殭屍物件?

retaincount = 0的物件被稱之為殭屍物件,也就是不能夠在訪問的物件

2.1是什麼問題導致,訪問殭屍物件,時而正確時而錯誤?

2.2如何開始xcode的時時檢測殭屍物件功能?

3.如何防止出現野指標操作?

通常在呼叫完release 方法後,會把儲存了物件指標位址的變數清空,賦值為nil

在oc中沒有空指標異常,所以使用[nil retain]呼叫方法不會導致異常的發生

4.什麼是記憶體洩漏?

已經不在使用的物件,沒有正確的釋放掉,一直駐留在記憶體中,我們就說是記憶體洩漏

5.記憶體洩漏有幾種情況?

1.沒有配對釋放,不符合記憶體管理原則

2.物件提前賦值為nil或者清空,導致release方法沒有起作用

6.當物件的retaincount = 0 時 能否呼叫 retain方法使物件復活?

已經被釋放的物件是無法在復活的

7.關於記憶體我們主要研究的問題是什麼?

1.野指標

2.記憶體洩露

**多個物件記憶體管理 問題

1.物件與物件之間存在幾種關係?

1.繼承關係

2.組合關係

3.物件作為方法引數傳遞

2.物件的組合關係中,如何確保作為成員變數的物件,不會被提前釋放?

重寫set方法,在set方法中,retain該對像,使其retaincount值增加 1

3.組合關係導致記憶體洩漏的原因是什麼?

在set方法中,retain了該物件,但是並沒有配對釋放

4.作為成員變數的物件,應該在那裡配對釋放?

在dealloc函式中釋放

** set方法記憶體管理 問題

1.在物件的組合關係中,導致記憶體洩漏有幾種情況?

1.set方法中沒有retain物件

2.沒有release掉舊的物件

3.沒有判斷向set方法中傳入的是否是同乙個物件

2.該如何正確的重寫set方法?

1.先判斷是否是同乙個物件

2.release一次舊的物件

3.retain新的物件

**記憶體管理@property引數 問題

1.@property引數分為幾類?

1.與set方法記憶體管理相關的引數

2.是否要生成set方法相關

3.多執行緒相關

4.set和get方法的名稱相關

2.@property引數那些適用於物件型別,那些適用於基本資料型別

3.如何使用@property生成符合記憶體管理的set方法?

4.@property retain引數能否用於基本資料型別?

**手動記憶體管理類的迴圈引用 問題

1.什麼情況下會出現類的迴圈應用?

2.@class關鍵子的作用?

3.手動記憶體管理如何解決類的迴圈引用問題?

4.在.h檔案中使用@class關鍵字宣告乙個類後,在.m檔案中是否能夠直接掉用該物件的方法?

**自動釋放池 問題

1.什麼是自動釋放池?

自動釋放池是用來儲存多個物件型別的指標變數

2.自動釋放池對池內物件的作用?

被存入到自動釋放池內的物件,當自動釋放池被銷毀時,會對池內的物件全部做一次release操作

3.物件如何放入到自動釋放池中?

當你確定要將物件放入到池中的時候,只需要呼叫物件的 autorelease 物件方法就可以把物件放入到自動釋放池中

4.如何建立自動釋放池?

物件在自動釋放池內部呼叫autorelease 方法

5.自動釋放池能否巢狀使用?

能6.自動釋放池何時被銷毀?

在autorelease } 執行完後

7.多次呼叫物件的autorelease方法會導致什麼問題?

多次將位址存到自動釋放池中,導致野指標異常

8.自動釋放池作用

將物件與自動釋放池建立關係,池子內呼叫autorelease 方法,在自動釋放池銷毀時銷毀物件,延遲release銷毀時間

**自動釋放池應用 問題

1.實際開發中一般如何使用autorlease

就是在方法中建立新的物件並且需要返回的時候

快速建立乙個類方法

**arc機制 問題

1.什麼是arc機制

自動引用計數,不需要程式設計師關心,物件的retain,與release操作

2.什麼是強指標(strong),弱指標(weak)

3.arc機制中,系統判斷物件是否被銷毀的依據是什麼?

指向物件的強指標是否被銷毀

4.arc機制中,如何觀察物件被銷毀了?

5.arc機制中為什麼還有autoreleasepool?

6.arc機制的本質是什麼?

對releasecount的計算,建立物件 +1, 清空指標 -1,或者越到autoreleasepool的大括號 -1

7.arc的目的

是讓程式設計師不在關心物件的retaincount

**arc機制 @property引數 問題

1.arc機制中如何讓@property生成符合記憶體管理的set方法

2.@property weak引數能否用於基本資料型別?

不能3.為什麼在arc機制中,不建議使用assign類表示物件的直接賦值

4.arc機制中不建議使用retain,assign ,容易造成混淆

**手動記憶體管理**轉換成arc** 問題

1.如何使用xcode自帶的功能,將手動記憶體管理**轉換成arc機制**

手動記憶體管理與arc機制**共存 問題

1.為什麼會出現手動記憶體管理與arc機制**共存現象?

2.為什麼不統一的將**都轉換成arc機制?

3.如何才能夠讓手動記憶體管理的**與arc機制的**共存?

**arc機制中類的相互引用 問題

1.arc機制中類的相互引用,與手動記憶體管理類的相互引用有什麼區別嗎?

2.如何解決arc機制下類的相互引用問題?

在.h檔案中使用@class關鍵字宣告乙個類,兩端不能都用強指標

一端用strong,一端用weak

C記憶體分配的注意點

c語言的記憶體分配,有很多的注意點。1.int 的大小問題。int 在不同的編譯器下大小是不一樣的。在tc下是2位,在 vc 下,和 long 一樣,是4位。2.memset 不是用來分配記憶體的,而是設定某個區域的記憶體為某個值,這個記憶體區域必須是可以修改的,而且是已經分配好了的。這個函式的原型...

OC中記憶體管理 ARC 注意點及單個物件處理

2019獨角獸企業重金招聘python工程師標準 第一 知道乙個專案是arc的還是mrc的,除了專案設定裡可以看,還有一點就是 arc是允許寫一些mrc的retain與release包括autorelease的。第二 了解兩個概念,強指標與弱指標 person p person alloc init...

買記憶體,注意這兩點

由於電腦出廠時的記憶體比較小,一般的是4g,現在有好多童鞋的記憶體已經不能滿足他了,電腦工作的時候有一點的卡頓,那麼為了讓自己的電腦更加流暢,就給他裝上乙個記憶體條吧,來拓展一下他的記憶體,讓他更好的為你服務!但是現在記憶體條的 還是居高不下,為了讓自己舒服點,該出手時就出手 1.匹配正確的記憶體型...