1. 程式人生 > >iOS面試知識點之記憶體管理

iOS面試知識點之記憶體管理

由於近期要準備面試,所以把知識點總結下

1.ARC與MRC的區別

MRC是引用計數機制用來管理記憶體。當oc物件發生一次alloc/retain/copy的時候,retainCount+1。當oc物件發生一次release的時候,retainCount-1。若retainCount=0時,銷燬該物件。

而autorelease是將物件交給自動釋放池,當自動釋放池銷燬時會給其中的物件都發送一次release訊息。

自動釋放池的建立有以下兩種

  • @autoreleasepool}
  • NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];   

    [pool  release];

ARC是在編譯過程中,自動給物件傳送retain/release等訊息大大減少了記憶體管理的麻煩。只要一個物件有強指標指向,這個物件就不會被釋放

MRC的缺點:

  • 想要釋放一個記憶體空間,要找到所有指向它的指標進行一次release,並且每個指標只能釋放一次,然後置空(避免誤操作)。
  • 多執行緒操作一個變數的時候,不確定哪個線上程中釋放,因為執行緒執行時間不一。

ARC的缺點:

  • 如果A引用B,B引用A。如果都用strong申明會導致迴圈引用問題。

[email protected]關鍵字 strong,weak,assign,copy,retain的區別與問題

  • assign一般用於CCRect之類的結構體以及基本資料型別,程式碼實現是直接賦值
  • retain一般用於OC物件型別用於MRC模式,程式碼實現是 if(_temp != temp) { [_temp release]; _temp = [temp retain]};  return _temp;
  • copy一般用於NSString型別以及Block,程式碼實現是 if(_temp != temp) { [_temp release]; _temp = [temp copy]};  return _temp;
  • strong一般用於OC物件用於ARC模式,代表用強指標指向物件
  • weak一般用於OC物件用於ARC模式,代表用弱指標指向物件
為什麼block要用copy,而不是assign,retain?

因為block預設申請的是棧記憶體,當block所在的方法執行完之後記憶體空間就被釋放。為了可以在外部使用block,需要把block放入堆記憶體中。MRC中只有copy做到這一點,ARC中copy可以。

為什麼NSString要用copy,而不用用strong?  (block  字典   陣列同理)

一個場景:如果用NSString指向一個NSMutableString的記憶體空間的話,用strong修飾。當NSMutableString中內容改變時,NSString指標指向的也會改變,而用copy不會
  • 必須使用copy的場景:A物件持有string記做A.string,然後賦值給B物件,記做B.string,若希望B.string的內容改變時A.string不改變就必須用copy
  • 必須用strong的場景:若希望B.string的內容改變時同時A.string也改變則必須用strong
淺拷貝與深拷貝的區別 前者淺拷貝就是隻拷貝物件,但是屬性不拷貝,拷貝出來的物件和原來的物件共用屬性,即指向同一個屬性地址

cocoa有如下規則:
  • 如果是foundation框架中的不可變的型別如NSString,copy相當於淺拷貝
  • mutableCopy怎麼拷貝都是深拷貝
  • 可變物件 copy也能深拷貝

3.關於迴圈引用問題

  • 當A強引用B,B強引用A。這會讓兩個都有強指標指向結果都無法釋放。解決辦法把其中一個用weak申明
  • 當block用copy屬性修飾的時候,block會對其中用到的OC物件有強引用。解決辦法把用到的oc物件用__weak宣告,mrc用__block申明
4.什麼情況會出現記憶體洩漏
  • 當呼叫一些C語言的Api用完沒有關閉(如利用UIGraphicsBeginImageContextWithOptions打開了圖形上下文,沒有close),導致資源沒有釋放
  • 出現迴圈引用的情況,導致資源沒有釋放
  • MRC中將OC物件的釋放權利交給自動釋放池,在池子被銷燬前程式建立n個oc物件,將導致記憶體洩漏。

相關推薦

iOS面試知識點記憶體管理

由於近期要準備面試,所以把知識點總結下 1.ARC與MRC的區別 MRC是引用計數機制用來管理記憶體。當oc物件發生一次alloc/retain/copy的時候,retainCount+1。當oc物件發生一次release的時候,retainCount-1。若retain

iOS效能優化記憶體管理:Analyze、Leaks、Allocations的使用和案例程式碼

一. 一些相關概念 1.記憶體空間的劃分: 我們知道,一個程序佔用的記憶體空間,包含5種不同的資料區:(1)BSS段:通常是存放未初始化的全域性變數;(2)資料段:通常是存放已初始化的全域性變數。(3)程式碼段:通常是存放程式執行程式碼。(4)堆:通常是用於存放程序執行中被

iOS面試——記憶體管理

記憶體管理 1.什麼是ARC? ARC是automatic reference counting自動引用計數,在程式編譯時自動加入retain/release。在物件被建立時retain count+1,在物件被release時count-1,當count=0時,銷燬物件。程式中加入

Android面試系列文章2018記憶體管理UI卡頓篇

Android面試系列文章2018之記憶體管理之UI卡頓篇 1.UI卡頓的原理   60ftp –> 16ms: Android系統每隔16ms都會對介面進行渲染一次,造成卡頓的原因就是Android系統在渲染的時候丟幀了, 16ms = 1000/60hz,相當於60fps

芒果iOS開發記憶體管理

/********** OC第十講記憶體管理 **********/ 主要內容  1.屬性的內部實現原理  2.dealloc內釋放例項變數  3.便利構造器方法的實現原理  4.collection的記憶體管理 /******* 1.屬性的內部實現原理 

iOS面試準備思維導圖(轉)

導圖 style 相關 開發者 框架 pan 面試準備 面試問題 edi 以思維導圖的方式對iOS常見的面試題知識點進行梳理復習。 目錄 1.UI視圖相關面試問題 2.Runtime相關面試問題 3.內存管理相關面試問題 4.Block相關面試問題 5.多線程相關面試問

AMS記憶體管理

原文地址:http://www.jianshu.com/p/72045d243b44 參考資料地址:http://book.51cto.com/art/201109/291375.htm 記憶體管理包括兩個部分 1.當應用程式關閉後,後臺對應的程序並沒有真正退出,以便下次啟動時能夠

安卓中高階開發面試知識點——快取

前言 幾乎所有的專案都做了快取,但是快取做的怎麼樣,其實只有我們自己知道。快取做的好,沒有網路也能流暢的使用;再多的資料請求都不會出現卡頓延遲等待很久的情況。 程式中除了圖片快取(三級快取),還有資訊快取。當用戶無法聯網時,app會預設顯示快取的資料。 前言快取方式 SQLite 下載完資料檔案後,

理解iOS 和 macOS 的記憶體管理

在 iOS 和 macOS 應用的開發中,無論是使用 Objective-C 還是使用 swift 都是通過引用計數策略來進行記憶體管理的,但是在日常開發中80%以上的情況,我們不需要考慮記憶體問題,因為 Objective-C 2.0 引入的自動引用計數(ARC)技術為開發者們自動的完成了

機器學習面試知識點決策樹相關

決策樹面試知識點最全總結(一) 一:首先明確以下幾個基本問題: 1.決策樹是幹什麼用的? 一種最基本的分類與迴歸方法,因為實際應用中基本上全是用來分類,所以重點討論分類決策樹。 2.決策樹優缺點: 優點: 1)

學了指標沒學動態記憶體一切都白搭!C語言基礎教程記憶體管理

本文將講解 C 中的動態記憶體管理。C 語言為記憶體的分配和管理提供了幾個函式。這些函式可以在<stdlib.h>標頭檔案中找到。 在記憶體中動態地分配 num 個長度為 size 的連續空間,並將每一個位元組都初始化為 0。所以它的結果是分配了 n

iOS面試準備思維導圖

目錄 1.UI檢視相關面試問題 2.Objective-C語言特性相關面試問題 3.Runtime相關面試問題 4.記憶體管理相關面試問題 5.Block相關面試問題 6.多執行緒相關面試問題 7.RunLoop相關面試問題 8.網路相關面試問題 9.設計模式相關面試問

理解 iOS 和 macOS 的記憶體管理

在 iOS 和 macOS 應用的開發中,無論是使用 Objective-C 還是使用 swift 都是通過引用計數策略來進行記憶體管理的,但是在日常開發中80%(這裡,我瞎說的,8020 原則嘛?)以上的情況,我們不需要考慮記憶體問題,因為 Objective

C++記憶體管理——在堆中申請100個char型別的記憶體,拷貝Hello world字串到分配的堆中的記憶體中,列印字串,最後釋放記憶體

首先先看一下簡單的案例 程式碼如下 #include<iostream> using namespace std; int main() { //整數1 int *x = new int; if(NULL==x) { return 0;

node記憶體管理以及效能分析

node是v8引擎實現的,所以是v8的記憶體管理。涉及到的主要方法有: process.memoryUsage(),v8.getHeapSpaceStatistics(),v8.getHeapStatistics(),os.cpus(),os.totalmem();下面這個討論,在開始討論以前先說一下v8的

深入理解JVM筆記記憶體管理機制

執行時資料區域 程式計數器 每個執行緒都有一個程式計數器(PC),是當前執行緒所執行的位元組碼的行號指示器,通過改變程式計數器的值來選取下一條指令。各執行緒之間的計數器互不影響,是執行緒私有的記憶體。  如果執行緒執行的是一個JAVA方法,則計數器記錄的為正在執行的位

初識英特爾執行緒構建模組記憶體管理tbb_malloc

什麼是TBB?TBB(Thread Building Blocks)是英特爾釋出的一個庫,全稱為 Threading Building Blocks,裡面包含了 Algorithms、Containers、Memory Allocation、Synchronization、Timing、Task Schedu

【原創】技術系列 記憶體管理(三)

作者:CppExplore 地址:http://www.cppblog.com/CppExplore/(2)boost::pool系列。boost的記憶體池最低層是simple_segregated_storage,類似於Loki中的chunk,在其中申請釋放block(boost中把block稱為c

Objective-C高階程式設計讀書筆記記憶體管理

Objective-C高階程式設計 iOS與OS X多執行緒和記憶體管理 自動引用計數(ARC, Automatic Reference Counting) 目錄 什麼是自動引用計數 記憶體管理的思考方式 autorelease 所有權修飾符介紹 ARC規則 ARC實

從零開始的jvm記憶體管理機制

該篇源自於對《深入理解java虛擬機器》的學習和總結。大牛拍磚請輕點。 1、執行時資料區域 1.1 程式計數器 定義:當前執行緒所執行的位元組碼的行號指示器。 設計目的:為了執行緒切換後能恢復到正確的執行位置,所以需要每個執行緒都擁有一個獨立的程式計數器。 注意: a、