iOS知識(shí)筆記


1、NSRunLoop

  • Runloop的作用在于當(dāng)有事情要做時(shí)它使當(dāng)前的thread工作,沒有事情做時(shí)又使thread 休眠sleep。Runloop并不是由系統(tǒng)自動(dòng)控制的,尤其是對(duì)那些新建的次線程需要對(duì)其進(jìn)行顯示的控制。
  • 有3類對(duì)象可以被run loop監(jiān)控:sourcestimers、observers。當(dāng)這些對(duì)象需要處理的時(shí)候,為了接收回調(diào),首先必須通過(guò) CFRunLoopAddSource ,CFRunLoopAddTimer 或者 CFRunLoopAddObserver 把這些對(duì)象放入run loop。 要停止接收它的回調(diào),可以通過(guò)CFRunLoopRemoveSource從run loop中移除某個(gè)對(duì)象。
  • 每一個(gè)線程都有自己的runloop, 主線程是默認(rèn)開啟的,創(chuàng)建的子線程要手動(dòng)開啟,因?yàn)?code>NSApplication 只啟動(dòng)main applicaiton thread。
  • NSTimer默認(rèn)添加到當(dāng)前NSRunLoop中,也可以手動(dòng)制定添加到自己新建的NSRunLoop的中。

2、為什么說(shuō)OC是runtime language?

  • 將數(shù)據(jù)類型的確定有編譯時(shí),推遲到了運(yùn)行時(shí)
  • 運(yùn)行時(shí)機(jī)制使我們直到運(yùn)行時(shí)才去決定一個(gè)對(duì)象的類型,以及調(diào)用改了別對(duì)象指定方法
  • 多態(tài)是指不同對(duì)象以自己的方式響應(yīng)相同的消息的能力

3、平鋪模式是指內(nèi)容組織上內(nèi)有層次關(guān)系,展示的內(nèi)容都放在一個(gè)主屏幕上,采用分屏或分頁(yè)控制器進(jìn)行導(dǎo)航,可以左右或上下滑動(dòng)屏幕查看內(nèi)容,設(shè)計(jì)控件:UIPageControlUIScrollView.

4、delegate中的property使用assign屬性的原因?
避免循環(huán)引用,例如,tableview中,viewController對(duì)象持有tableview,如果tableview不適用assign,會(huì)造成tableview也持有viewController,即相互持有,結(jié)果是viewController內(nèi)存泄漏,釋放不掉。

5、NSXMLParser構(gòu)造方法有哪些?
查api知道有3個(gè):
initWithContentOfURLinitWithDatainitWithStream 也就是本地xml文件的解析必須轉(zhuǎn)化為NSData
查api知道json初始化方法:
JSONObjectWithData、JSONObjectWithStream
解析json用dataWithJSONObject、writeJSONObject toStream

6、**static **關(guān)鍵字的作用

  • 函數(shù)體內(nèi) static 變量的作用范圍為該函數(shù)體,不同于 auto 變量,該變量的內(nèi)存只被分配一次,
    因此其值在下次調(diào)用時(shí)仍維持上次的值;
  • 在模塊內(nèi)的 static 全局變量可以被模塊內(nèi)所用函數(shù)訪問(wèn),但不能被模塊外其它函數(shù)訪問(wèn);
  • 在模塊內(nèi)的 static 函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用,這個(gè)函數(shù)的使用范圍被限制在聲明
    它的模塊內(nèi);
  • 在類中的 static 成員變量屬于整個(gè)類所擁有,對(duì)類的所有對(duì)象只有一份拷貝;
  • 在類中的 static 成員函數(shù)屬于整個(gè)類所擁有,這個(gè)函數(shù)不接收 this 指針,因而只能訪問(wèn)類的static 成員變量。

7、線程與進(jìn)程的區(qū)別和聯(lián)系
進(jìn)程和線程都是由操作系統(tǒng)所體會(huì)的程序運(yùn)行的基本單元,系統(tǒng)利用該基本單元實(shí)現(xiàn)系統(tǒng)對(duì)應(yīng)用的并發(fā)性。
程和線程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式。進(jìn)程有獨(dú)立的地址空間,一個(gè)進(jìn)程崩潰后,在保護(hù)模式下不會(huì)對(duì)其它進(jìn)程產(chǎn)生影響,而線程只是一個(gè)進(jìn)程中的不同執(zhí)行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨(dú)的地址空間,一個(gè)線程死掉就等于整個(gè)進(jìn)程死掉,所以多進(jìn)程的程序要比多線程的程序健壯,但在進(jìn)程切換時(shí),耗費(fèi)資源較大,效率要差一些。但對(duì)于一些要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作,只能用線程,不能用進(jìn)程。

8、堆和棧的區(qū)別
管理方式:對(duì)于棧來(lái)講,是由編譯器自動(dòng)管理,無(wú)需我們手工控制;對(duì)于堆來(lái)說(shuō),釋放工作由程序員控制,容易產(chǎn)生memory leak。
申請(qǐng)大?。?br> 棧:在Windows下,棧是向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存的區(qū)域。這句話的意思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的,在 WINDOWS下,棧的大小是2M(也有的說(shuō)是1M,總之是一個(gè)編譯時(shí)就確定的常數(shù)),如果申請(qǐng)的空間超過(guò)棧的剩余空間時(shí),將提示overflow。因此,能從棧獲得的空間較小。
堆:堆是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域。這是由于系統(tǒng)是用鏈表來(lái)存儲(chǔ)的空閑內(nèi)存地址的,自然是不連續(xù)的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計(jì)算機(jī)系統(tǒng)中有效的虛擬內(nèi)存。由此可見,堆獲得的空間比較靈活,也比較大。
碎片問(wèn)題:對(duì)于堆來(lái)講,頻繁的new/delete勢(shì)必會(huì)造成內(nèi)存空間的不連續(xù),從而造成大量的碎片,使程序效率降低。對(duì)于棧來(lái)講,則不會(huì)存在這個(gè)問(wèn)題,因?yàn)闂J窍冗M(jìn)后出的隊(duì)列,他們是如此的一一對(duì)應(yīng),以至于永遠(yuǎn)都不可能有一個(gè)內(nèi)存塊從棧中間彈出
分配方式:堆都是動(dòng)態(tài)分配的,沒有靜態(tài)分配的堆。棧有2種分配方式:靜態(tài)分配和動(dòng)態(tài)分配。靜態(tài)分配是編譯器完成的,比如局部變量的分配。動(dòng)態(tài)分配由alloca函數(shù)進(jìn)行分配,但是棧的動(dòng)態(tài)分配和堆是不同的,他的動(dòng)態(tài)分配是由編譯器進(jìn)行釋放,無(wú)需我們手工實(shí)現(xiàn)。
分配效率:棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),計(jì)算機(jī)會(huì)在底層對(duì)棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執(zhí)行,這就決定了棧的效率比較高。堆則是C/C++函數(shù)庫(kù)提供的,它的機(jī)制是很復(fù)雜的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容