iOS-2019-面試題及答案

知識點:棧和堆得內存管理

1.內存管理範圍
只有oc對象需要進行內存管理
非oc對象類型比如基本數據類型不需要進行內存管理
2.內存管理本質
因爲:Objective-C的對象在內存中是以堆的方式分配空間的,並且堆內存是由你釋放的,就是release
OC對象存放於堆裏面(堆內存要程序員手動回收)
非OC對象一般放在棧裏面(棧內存會被系統自動回收)
堆裏面的內存是動態分配的,所以也就需要程序員手動的去添加內存、回收內存
3.內存分配以及管理方式
按分配方式分
堆是動態分配和回收內存的,沒有靜態分配的堆
棧有兩種分配方式:靜態分配和動態分配
靜態分配是系統編譯器完成的,比如局部變量的分配
動態分配是有alloc函數進行分配的,但是棧的動態分配和堆是不同的,它的動態分配也由系統編譯器進行釋放,不需要程序員手動管理
按管理方式分
對於棧來講,是由系統編譯器自動管理,不需要程序員手動管理
對於堆來講,釋放工作由程序員手動管理,不及時回收容易產生內存泄露
堆:是大家共有的空間,分全局堆和局部堆。全局堆就是所有沒有分配的空間,局部堆就是用戶分配的空間。堆在操作系統對進程 初始化的時候分配,運行過程中也可以向系統要額外的堆,但是記得用完了要還給操作系統,要不然就是內存泄漏。堆裏面一般 放的是靜態數據,比如static的數據和字符串常量等,資源加載後一般也放在堆裏面。一個進程的所有線程共有這些堆 ,所以對堆的操作要考慮同步和互斥的問題。程序裏面編譯後的數據段都是堆的一部分。
棧:是個線程獨有的,保存其運行狀態和局部自動變量的。棧在線程開始的時候初始化,每個線程的棧互相獨立,因此 ,棧是 thread safe的。每個c++對象的數據成員也存在在棧中,每個函數都有自己的棧,棧被用來在函數之間傳遞參數。操作系統在切換線程的時候會自動的切換棧,就是切換ss/esp寄存器。棧空間不需要在高級語言裏面顯式的分配 和釋放。
一句話總結就是 堆:由程序員分配和釋放,如果不釋放可能會引起內存泄漏 棧:由編譯器自動分配和釋放,一般存放參數值,局部變量

4.#import 和#include有 麼區別?@class呢?#import <>和 #import"" 有 麼區別?
答:import是OC導入頭文件的關鍵字,#include是C/C++導入頭文件的關鍵字
使用#import只導入一次不會重複導入,相當於#include和#pragma once;(使用#include可能會出現循環引用,使用#pragma once消除這種可能)
@class一般用於聲明某個字符串作爲類名使用,它只是聲明瞭一個類名,沒有導入.h文件中的內容,不會引起交叉編譯問題
import< >代表導入系統自帶的框架
import" "代表導入我們自己創建的文件,導入的使我們.h文件,也就是頭文件

5.IBOutlet 連出來的視圖屬性爲什麼可以被設置成weak?
答:在 storyboard 中添加一個控件引用關係是這樣的(以 UIbutton 爲例): UIviewController -> UIview -> UIbutton
此時 UIviewController 強引用着 UIview , UIview 強引用着 UIbutton , IBoutlet 連線到控制器的. m 或者. h 中作爲視圖的屬性時用 weak 修飾就可以了, (覺得用 strong 修飾也可以但是沒有必要)
添加到子控件也是強引用: UIbutton 就是添加到了 UIviewController 的 view 上

6.分析json、xml 的區別? json、xml 解析 式的底層是如何讓處理的

(一)JSON與XML的區別:
(1)可讀性方面:基本相同,XML的可讀性比較好;
(2)可擴展性方面:都具有良好的擴展性;
(3)編碼難度方面:相對而言,JSON的編碼比較容易;
(4)解碼難度:JSON的解碼難度基本爲零,XML需要考慮子節點和父節點;
(5)數據體積方面:JSON相對於XML來講,數據體積小,傳遞的速度比較快;
(6)數據交互方面:JSON與javascript的交互更加方便,更容易解析處理,更好的數據交互;
(7)數據描述方面:XML對數據描述性比較好
(8)傳輸速度方面:JSON的速度遠遠快於XML。
(二)JSON與XML底層實現原理:
 (1)JSON底層原理:遍歷字符串中的字符,最終根據格式規定的特殊字符,比如{}、[]、:等進行區分,{}號表示字典,[]號表示數組,:號是字典的鍵和值的分水嶺,最終仍是將JSON轉化爲字典,只不過字典中的值可能是“字典、數組或者字符串而已”。
 (2)XML底層原理:XML解析常用的解析方法有兩種:DOM解析和SAX解析;DOM採用的是樹形結構的方式訪問XML文檔,而SAX採用的是事件模型;DOM解析把XML文檔轉化爲一個包含其內容的樹,並可以對樹進行遍歷,使用DOM解析器的時候需要處理整個XML文檔,所以對內存和性能的要求比較高;SAX在解析XML文檔的時候可以觸發一系列的事件,當發現給定的tag的時候,他可以激活一個回調方法,告訴該方法指定的標籤已經找到,SAX對內存的要求通常會比較低,因爲他讓開發人員自己來決定所要處理的tag,特別是當開發人員只需要處理文檔中所包含部分數據時,SAX這種擴展能力得到了更好的體現。
 
 臨近2020屆畢業生秋招面試馬上要開始了,如果有需要更多資料的同志們
 可以加扣扣:3434583796

 
作者:陳雨塵
轉載鏈接:https://www.jianshu.com/p/3707a4e7377d

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章