iOS經典面試題總結 記憶體管理

2021-07-25 04:24:56 字數 3172 閱讀 7974

1.什麼是arc?

arc是automatic reference counting自動引用計數,在程式編譯時自動加入retain/release。在物件被建立時retain count+1,在物件被release時count-1,當count=0時,銷毀物件。程式中加入autoreleasepool物件會由系統自動加上autorelease方法,如果該物件引用計數為0,則銷毀。那麼arc是為了解決mrc手動管理記憶體存在的一些而誕生的。

mrc下記憶體管理的缺點:

釋放乙個堆記憶體時,首先要確定指向這個堆空間的指標都被release了。(避免提前釋放)

釋放指標指向的堆空間,首先要確定哪些指向同乙個堆,這些指標只能釋放一次。(避免釋放多次,造成記憶體洩露)

模組化操作時,物件可能被多個模組建立和使用,不能確定最後由誰釋放

多執行緒操作時,不確定哪個執行緒最後使用完畢。

雖然arc給我們程式設計帶來的很多好多,但也可能出現記憶體洩露。如下面兩種情況:

迴圈參照:a有個屬性參照b,b有個屬性參照a,如果都是strong參照的話,兩個物件都無法釋放。

死迴圈:如果有個viewcontroller中有無限迴圈,也會導致即使viewcontroller對應的view消失了,viewcontroller也不能釋放。

2.block一般用那個關鍵字修飾,為什麼?

block一般使用copy關鍵之進行修飾,block使用copy是從mrc遺留下來的「傳統」,在mrc中,方法內容的block是在棧區的,使用copy可以把它放到堆區。但在arc中寫不寫都行:編譯器自動對block進行了copy操作。

3.用@property宣告的nsstring(或nsarray,nsdictionary)經常使用copy關鍵字,為什麼?如果改用strong關鍵字,可能造成什麼問題?

答:用@property宣告 nsstring、nsarray、nsdictionary 經常使用copy關鍵字,是因為他們有對應的可變型別:nsmutablestring、nsmutablearray、nsmutabledictionary,他們之間可能進行賦值操作,為確保物件中的字串值不會無意間變動,應該在設定新屬性值時拷貝乙份。

如果我們使用是strong,那麼這個屬性就有可能指向乙個可變物件,如果這個可變物件在外部被修改了,那麼會影響該屬性。

copy此特質所表達的所屬關係與strong類似。然而設定方法並不保留新值,而是將其「拷貝」 (copy)。 當屬性型別為nsstring時,經常用此特質來保護其封裝性,因為傳遞給設定方法的新值有可能指向乙個nsmutablestring類的例項。這個類是nsstring的子類,表示一種可修改其值的字串,此時若是不拷貝字串,那麼設定完屬性之後,字串的值就可能會在物件不知情的情況下遭人更改。所以,這時就要拷貝乙份「不可變」 (immutable)的字串,確保物件中的字串值不會無意間變動。只要實現屬性所用的物件是「可變的」 (mutable),就應該在設定新屬性值時拷貝乙份。

4.runloop、autorelease pool以及執行緒之間的關係。

每個執行緒(包含主線程)都有乙個runloop。對於每乙個runloop,系統會隱式建立乙個autorelease pool,這樣所有的release pool會構成乙個像callstack一樣的乙個棧式結構,在每乙個runloop結束時,當前棧頂的autorelease pool會被銷毀,這樣這個pool裡的每個object會被release。

5.@property 的本質是什麼?ivar、getter、setter 是如何生成並新增到這個類中的。

「屬性」(property)有兩大概念:ivar(例項變數)、訪問方法(access method=getter),即@property = ivar + getter + setter。

例如下面的這個類:

@inte***ce

wbtextview :uitextview

@property (nonatomic,copy)nsstring *placehold;

@property (nonatomic,copy)uicolor *placeholdcolor;

@end

類完成屬性的定以後,編譯器會自動編寫訪問這些屬性的方法(自動合成autosynthesis),上述**寫出來的類等效與下面的**:

@inte***ce

wbtextview :uitextview

- (nsstring *)placehold;

-(void)setplacehold:(nsstring *)placehold;

-(uicolor *)placeholdcolor;

-(void)setplaceholdcolor:(uicolor *)placeholdcolor;

@end

詳細介紹見:

6.分別寫乙個setter方法用於完成@property (nonatomic,retain)nsstring *name和@property (nonatomic,copy) nsstring *name

retain屬性的setter方法是保留新值並釋放舊值,然後更新例項變數,令其指向新值。順序很重要。假如還未保留新值就先把舊值釋放了,而且兩個值又指向同乙個物件,先執行的release操作就可能導致系統將此物件永久**。

if (_name != name)

}- (void)setname:(nsstring *)name}

7.說說assign vs weak,_block vs _weak的區別

assign適用於基本資料型別,weak是適用於nsobject物件,並且是乙個弱引用。

assign其實頁可以用來修飾物件,那麼為什麼不用它呢?因為被assign修飾的物件在釋放之後,指標的位址還是存在的,也就是說指標並沒有被置為nil。如果在後續記憶體分配中,剛才分到了這塊位址,程式就會崩潰掉。而weak修飾的物件在釋放之後,指標位址會被置為nil。

_block是用來修飾乙個變數,這個變數就可以在block中被修改。

_block:使用_block修飾的變數在block**塊中會被retain(arc下,mrc下不會retain)

_weak:使用_weak修飾的變數不會在block**塊中被retain

iOS 記憶體管理面試題(記憶體布局)

記憶體布局 2 64bit和32bit下 long 和char所佔位元組是不同的 char 1位元組 ascii 2 256個字元 char 即指標變數 4個位元組 32位的定址空間是2,即32個bit,也就是4個位元組。同理64位編譯器為8個位元組 short int 2個位元組 範圍 2 2 即...

iOS經典面試題 二

ios經典面試題 二 1 kvo,nsnotification,delegate及block區別 kvo就是cocoa框架實現的觀察者模式,一般同kvc搭配使用,通過kvo可以監測乙個值的變化,比如view的高度變化。是一對多的關係,乙個值的變化會通知所有的觀察者。nsnotification是通知...

iOS 面試題總結

基礎但是重要 1,static 關鍵字至少有下列 n個作用 1 函式體內 static 變數的作用範圍為該函式體,不同於 auto 變數,該變數的記憶體只被分配一次,因此其值在下次呼叫時仍維持上次的值 2 在模組內的 static 全域性變數可以被模組內所用函式訪問,但不能被模組外其它函式訪問 3 ...