iOS知識(shí)點(diǎn)總結(jié)(一)

1. 堆和棧

1.1為什么有堆和棧缸沃? :

移動(dòng)設(shè)備的內(nèi)存是有限的,每個(gè)App所占的內(nèi)存都有一定限制修械,所以需要堆和棧來管理內(nèi)存趾牧。

1.2 App占用手機(jī)內(nèi)存的行為有:
  • 創(chuàng)建一個(gè)OC對(duì)象
  • 定義一個(gè)變量
  • 調(diào)用一個(gè)函數(shù)或者方法
1.3 內(nèi)存管理的范圍和原因:
  • 只有OC對(duì)象需要內(nèi)存管理,基本數(shù)據(jù)類型不需要進(jìn)行數(shù)據(jù)管理
  • OC對(duì)象一般存儲(chǔ)在堆里肯污,由于堆內(nèi)存是動(dòng)態(tài)分配的翘单,所以堆內(nèi)存需要程序員手動(dòng)回收吨枉;非OC對(duì)象存儲(chǔ)在棧中,棧內(nèi)存會(huì)被系統(tǒng)自動(dòng)回收哄芜。
  • 對(duì)于對(duì)象而言貌亭,棧內(nèi)存用于存放對(duì)象的指針,堆內(nèi)存用于存放對(duì)象
內(nèi)存中的五大區(qū)域
  • 棧區(qū)
  • 堆區(qū)
  • BSS段
  • 數(shù)據(jù)段
  • 代碼段
  1. 棧:存儲(chǔ)局部變量认臊,當(dāng)其作用域執(zhí)行完畢之后圃庭,就會(huì)被系統(tǒng)立即收回
  2. 堆:存儲(chǔ)OC對(duì)象,手動(dòng)申請(qǐng)的字節(jié)空間失晴,需要調(diào)用free來釋放
  3. BSS段:未初始化的全局變量和靜態(tài)變量剧腻,一旦初始化就會(huì)從BSS段中回收掉,轉(zhuǎn)存到數(shù)據(jù)段中
  4. 數(shù)據(jù)段(常量區(qū)):存儲(chǔ)已經(jīng)初始化的全局變量和靜態(tài)變量涂屁,以及常量數(shù)據(jù)书在,直到結(jié)束程序時(shí)才會(huì)被立即收回
  5. 代碼段:代碼,直到結(jié)束程序時(shí)才會(huì)被立即收回

2. 進(jìn)程和線程

  1. 線程和進(jìn)程的區(qū)別主要在于它們是不同的操作系統(tǒng)資源管理方式拆又。進(jìn)程有獨(dú)立的地址空間蕊温,一個(gè)進(jìn)程崩潰后,在保護(hù)模式的影響下不會(huì)對(duì)其他進(jìn)程產(chǎn)生影響遏乔,而線程只是一個(gè)進(jìn)程中的不同執(zhí)行路徑。
  2. 線程有自己的堆棧和局部變量发笔,但線程之間沒有單獨(dú)的地址空間盟萨,一個(gè)線程死掉就等同于整個(gè)進(jìn)程死掉,所以多進(jìn)程的程序要比多線程的程序健壯了讨,但在進(jìn)程切換時(shí)捻激,耗費(fèi)資源較大,效率要差一些前计。但對(duì)于一些要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作胞谭,只能用線程,不能用進(jìn)程男杈。
  3. 進(jìn)程屬于資源分配和調(diào)度的單位丈屹,而線程是處理機(jī)調(diào)度和分配的單位
  4. 系統(tǒng)切換線程的代價(jià)比切換進(jìn)程要低;

3. 引用和指針

  1. 引用可以表示指針
  2. 引用和指針都是實(shí)現(xiàn)多態(tài)效果的手段
  3. 引用本身是目標(biāo)變量的別名伶棒,對(duì)引用的操作就是對(duì)目標(biāo)變量的操作
  4. 指針只是一個(gè)地址旺垒,是指向某個(gè)對(duì)象的一串內(nèi)存地址。一個(gè)引用對(duì)象肤无,其實(shí)就是被引用的對(duì)象它本身先蒋。指針的指向是可以改變的,而引用是不能改變的宛渐。

4. 局部變量和全局變量

  1. 局部變量的生命周期只在代碼塊內(nèi)
  2. 全局變量貫穿整個(gè)程序的生命周期

5. @property竞漾、@synthesize眯搭、@dynamic

  • @property的本質(zhì):

@property = ivar + getter + setter

  • ivar是成員變量,以下劃線開頭业岁,property是屬性鳞仙。
  • 使用@synthesize 只有一個(gè)目的——給實(shí)例變量起個(gè)別名,或者說為同一個(gè)變量添加兩個(gè)名字叨襟。
  • 如果要阻止自動(dòng)合成繁扎,記得使用@dynamic。經(jīng)典的使用場(chǎng)景是你知道已經(jīng)在某處實(shí)現(xiàn)了getter/setter 方法糊闽,而編譯器不知道的情況梳玫。
  1. @synthesize 的作用:是為屬性添加一個(gè)實(shí)例變量名,或者說別名右犹。同時(shí)會(huì)為該屬性生成 setter/getter 方法提澎。
  2. @synthesize:如果某屬性已經(jīng)在某處實(shí)現(xiàn)了自己的 setter/getter ,可以使用 @dynamic 來阻止 @synthesize 自動(dòng)生成新的 setter/getter 覆蓋。
  3. 內(nèi)存管理:@synthesize 和 ARC 無關(guān)念链。
  4. 使用:一般情況下無需對(duì)屬性添加 @synthesize 盼忌,但一些特殊情形仍然需要,例如protocol中聲明的屬性掂墓。

6. +load()和 +initialize()

  1. load和initialize方法都會(huì)在實(shí)例化對(duì)象之前調(diào)用谦纱,以main函數(shù)為分水嶺,前者在main函數(shù)之前調(diào)用君编,后者在之后調(diào)用跨嘉。
  2. +initialize 方法會(huì)在類收到第一個(gè)消息時(shí)調(diào)用,是一個(gè)懶加載的方式吃嘿,如果一直沒收到消息祠乃,則永不調(diào)用。這種設(shè)計(jì)節(jié)省了資源
  3. +load方法是系統(tǒng)根據(jù)方法地址直接調(diào)用兑燥,并不是objc_msgSend函數(shù)調(diào)用(isa亮瓷,superClass);這就決定了如果子類沒有實(shí)現(xiàn)+load方法降瞳,那么當(dāng)它被加載時(shí)runtime是不會(huì)調(diào)用父類的+load方法的嘱支,除非父類也實(shí)現(xiàn)了+load方法;

7. OC程序的編譯挣饥、鏈接斗塘、執(zhí)行

  1. 在.m文件中寫上符合OC語法規(guī)范的源代碼

生成main.m

  1. 使用編譯器將源代碼編譯成目標(biāo)文件

命令行 : cc -c mian.m

  1. 預(yù)處理
  2. 檢察語法
  3. 編譯

將 main.m -> main.o

  1. 鏈接

命令行 :cc mian.o - framework Foundation
告訴編譯器用到了哪些框架,去哪兒找這些框架
生成可執(zhí)行文件 main.o -> a.out

9. @try亮靴、@catch馍盟、@finally有什么用?

  • try可以讓程序拋出異常后不立即崩潰茧吊,在處理完異常后可以繼續(xù)執(zhí)行后面的代碼
@try
{
    //把可能拋出異常的代碼放在這里    
}
@catch(NSException *ex){
    //如果拋出異常贞岭,則在這里處理   
}
@finally
{
    //無論是否發(fā)生異常八毯,都會(huì)執(zhí)行這段代碼
}
  • 當(dāng)@try中的代碼發(fā)生了異常,發(fā)生異常后面的代碼不會(huì)執(zhí)行瞄桨,會(huì)立即轉(zhuǎn)到@catch中话速,如果沒發(fā)生異常,會(huì)執(zhí)行完@try后跳過@catch芯侥。@catch只會(huì)在@try發(fā)生異常時(shí)執(zhí)行
  • @finally無論在是否發(fā)生異常泊交,都會(huì)執(zhí)行@finally里面的代碼

10. 類方法和對(duì)象方法

  1. 類方法中不能訪問屬性,不能調(diào)用對(duì)象方法柱查;對(duì)象方法中可以直接調(diào)用類方法廓俭。
  2. 類的屬性是存在對(duì)象中的,一個(gè)類被加載時(shí)唉工,并不會(huì)創(chuàng)建對(duì)象研乒,所以調(diào)用類方法時(shí),是直接訪問內(nèi)存中的代碼段淋硝,并沒有屬性可以訪問雹熬。
  3. 類方法需要通過類名調(diào)用,不能用self調(diào)用谣膳,self代表類對(duì)象竿报。
  4. 類方法比對(duì)象方法更節(jié)約空間,效率更高继谚。
  5. 當(dāng)方法不需要訪問屬性仰楚,也不用調(diào)用其他對(duì)象方法,就可以用類方法犬庇。

11. instancetype的含義

  • instancetype作為返回值時(shí),代表了當(dāng)前這個(gè)類的對(duì)象

12. static的含義

  • static 不能修飾屬性和方法
  • static可以修飾方法中的局部變量侨嘀,如果方法中的局部變量被static修飾臭挽,就會(huì)變成靜態(tài)變量,會(huì)儲(chǔ)存在常量區(qū)咬腕,當(dāng)方法結(jié)束欢峰,不會(huì)被回收。

12. self關(guān)鍵字

  • self是一個(gè)指針涨共,在對(duì)象方法中纽帖,self指向當(dāng)前對(duì)象;在類方法中举反,self指向當(dāng)前類
  • 當(dāng)方法中有和屬性同名的變量懊直,默認(rèn)先使用變量而不是屬性,要想使用屬性火鼻,必須調(diào)用self
  • 在方法中想調(diào)用當(dāng)前對(duì)象的的另一個(gè)方法室囊,也需要用到self
  • 在類方法中使用self雕崩,self代表了當(dāng)前類在代碼段中的地址,可以用在類方法中調(diào)用其他類方法融撞。

13. super的含義

  • 在對(duì)象方法調(diào)用super盼铁,super代表調(diào)用從父類繼承過來的對(duì)象方法
  • 在類方法調(diào)用super,super代表調(diào)用從父類繼承過來的類方法

14. @private尝偎、@protected饶火、@public

  • @private修飾的屬性,只能在本類內(nèi)部訪問
  • @protected修飾的屬性致扯,只能在本類和子類中訪問(不寫默認(rèn)是@protected)
  • @public修飾的屬性肤寝,可以在任意地方訪問
  • 子類任然可以繼承父類的私有屬性,只不過不能直接訪問父類的私有屬性
  • 將屬性定義在@implementation中急前,外界訪問不到醒陆,任何修飾符都無效

15.description

  • NSObject中description方法用來打印對(duì)象的信息<類名:對(duì)象地址>
  • 重寫description可以自定義打印信息

16.什么是SEL?

  • SEL叫做selector方法選擇器裆针,是一個(gè)類
  • SEL對(duì)象用來存儲(chǔ)一個(gè)方法
  • 類對(duì)象存儲(chǔ)方法的過程:
    1. 創(chuàng)建一個(gè)SEL對(duì)象
    2. 將方法的信息(方法類型刨摩,返回值,方法名世吨,方法參數(shù)澡刹,方法體)存儲(chǔ)在SEL對(duì)象中
    3. 再將SEL對(duì)象作為類對(duì)象的屬性存儲(chǔ)
SEL s1 = @selector(methodName)

17. 點(diǎn)語法的本質(zhì)

  • 當(dāng)點(diǎn)語法在等號(hào)的左邊(self.age = xx),會(huì)調(diào)用屬性的setter方法
  • 當(dāng)點(diǎn)語法在等號(hào)的左邊(int a = self.age)耘婚,會(huì)調(diào)用屬性的getter方法
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末罢浇,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子沐祷,更是在濱河造成了極大的恐慌嚷闭,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赖临,死亡現(xiàn)場(chǎng)離奇詭異胞锰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)兢榨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門嗅榕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吵聪,你說我怎么就攤上這事凌那。” “怎么了吟逝?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵帽蝶,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我块攒,道長(zhǎng)嘲碱,這世上最難降的妖魔是什么金砍? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮麦锯,結(jié)果婚禮上恕稠,老公的妹妹穿的比我還像新娘。我一直安慰自己扶欣,他們只是感情好鹅巍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著料祠,像睡著了一般骆捧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上髓绽,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天敛苇,我揣著相機(jī)與錄音,去河邊找鬼顺呕。 笑死枫攀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的株茶。 我是一名探鬼主播来涨,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼启盛!你這毒婦竟也來了蹦掐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤僵闯,失蹤者是張志新(化名)和其女友劉穎卧抗,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鳖粟,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡社裆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了牺弹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡时呀,死狀恐怖张漂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谨娜,我是刑警寧澤航攒,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站趴梢,受9級(jí)特大地震影響漠畜,放射性物質(zhì)發(fā)生泄漏币他。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一憔狞、第九天 我趴在偏房一處隱蔽的房頂上張望蝴悉。 院中可真熱鬧,春花似錦瘾敢、人聲如沸拍冠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽庆杜。三九已至,卻和暖如春碟摆,著一層夾襖步出監(jiān)牢的瞬間晃财,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工典蜕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留断盛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓嘉裤,卻偏偏與公主長(zhǎng)得像郑临,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子屑宠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354