*Property屬性
1)atomic
原子性,只有一個(gè)線程訪問實(shí)例婆跑,線程安全(當(dāng)前讀取器),開銷大庭呜,耗資源滑进。
2)natomic
非原子性,線程不安全募谎,可以被多個(gè)線程訪問扶关,效率高
3)assign(int, float) & weak & unsafe_unretained
a.修飾效果相同数冬,不會(huì)改變引用計(jì)數(shù)节槐,也不會(huì)改變舊數(shù)據(jù)的引用計(jì)數(shù)
b. assign:一般只修飾值類型,雖然可以修飾引用類型吉执,但修飾對象釋放后疯淫,指針不會(huì)置空,此時(shí)向?qū)ο蟀l(fā)消息會(huì)奔潰
c. weak不會(huì)產(chǎn)生野指針的問題戳玫,修飾的對象被釋放后熙掺,引用計(jì)數(shù)為0,指針置空咕宿,向?qū)ο蟀l(fā)消息不會(huì)奔潰币绩,weak是安全的。
d. ansafe_unretained只修飾對象
4)strong & retain & copy
a. 三者用于修飾引用類型
b. strong用于ARC府阀,retain用于MRC
只要最后一個(gè)strong型指針不再指向?qū)ο罄铝停敲磳ο缶蜁?huì)被釋放,即使還有weak型指針指向它试浙。一旦最后一個(gè)strong型指針離去 董瞻,這個(gè)對象將被釋放,所有剩余的weak型指針都將被清除。
c. copy分為深復(fù)制和淺復(fù)制钠糊。NSString挟秤,NSArray等不可變?yōu)闇\復(fù)制,引用計(jì)數(shù)會(huì)+1抄伍,不會(huì)創(chuàng)建新的內(nèi)存艘刚。
拷貝條件
iOS中并非所有的對象都支持copy和mutableCopy,只有遵循了NSCopy協(xié)議或者NSMutableCoy協(xié)議的類才行截珍。如果遵循著兩個(gè)協(xié)議就必須分別實(shí)現(xiàn)copyWithZone和mutableCopyZone方法
*沙盒
1)Documents:保存運(yùn)用運(yùn)行時(shí)生成的持久化數(shù)據(jù)桶良,如游戲進(jìn)度束铭,繪圖等信息养匈,會(huì)被ITunes同步備份芍秆。
2)Library/Caches:保存運(yùn)用運(yùn)行時(shí)生成的持久化數(shù)據(jù),ITunes不會(huì)同步備份沈堡,一般存儲(chǔ)體積大静陈,不需要備份等非重要數(shù)據(jù),如緩存的圖片诞丽,離線數(shù)據(jù)等鲸拥。
3)tmp,保存運(yùn)用等臨時(shí)數(shù)據(jù)僧免,內(nèi)存不足及不運(yùn)行時(shí)會(huì)被清除刑赶,不會(huì)備份
內(nèi)存區(qū)域劃分
1)棧區(qū),由系統(tǒng)自動(dòng)分配和釋放懂衩,存放局部變量撞叨,容量小,速度快浊洞,有序牵敷。
2)堆,由程序員自己分配法希,不釋放會(huì)出現(xiàn)內(nèi)存泄漏枷餐,程序會(huì)回收內(nèi)存,容量大苫亦,速度慢毛肋,無序。
3)靜態(tài)存儲(chǔ)區(qū)屋剑,存放全局變量和靜態(tài)變量润匙,程序結(jié)束時(shí),系統(tǒng)回收唉匾。
4)常量區(qū)孕讳,存放常量,程序結(jié)束時(shí),系統(tǒng)回收厂财。
5)代碼區(qū)油啤,存放二進(jìn)制代碼。
Block為什么要用copy修飾
1)block創(chuàng)建時(shí)默認(rèn)分配的內(nèi)存是在棧棧上的蟀苛,而不是在堆上,其本身的作用領(lǐng)域?qū)儆趧?chuàng)建時(shí)候的作用域逮诲,一旦在作用域之外的內(nèi)存調(diào)用就會(huì)導(dǎo)致程序奔潰帜平,所以使用copy拷貝到堆上。
2)block創(chuàng)建在棧上梅鹦,而block中的代碼可能會(huì)用到本地的代碼裆甩,只有將其拷貝到堆上,才能使用這些變量齐唆。
Block為什么不用retain修飾
retain修飾時(shí)增加引用計(jì)數(shù)器嗤栓,block是存在棧上,可能隨時(shí)會(huì)被系統(tǒng)回收
進(jìn)入Block中的對象的引用計(jì)數(shù)器為什么會(huì)自動(dòng)+1
block執(zhí)行的是回調(diào)箍邮,因此block并不知道其中的對象創(chuàng)建后會(huì)在什么時(shí)候釋放茉帅,為了不在block使用之前對象就已經(jīng)被釋放,所以block就增加一次使用對象的引用計(jì)數(shù)器
Block對于基本數(shù)據(jù)類型锭弊,會(huì)當(dāng)作常量處理
int num1 = 10;
void (^block)() = ^{
NSlog(@"%d",num1); //
}
num1 = 20;
block();//輸出10
//如果要修改進(jìn)入block中的變量堪澎,則需加__block關(guān)鍵字
__block int num1 = 10;
void (^block)() = ^{
NSlog(@"%d",num1); //
}
num1 = 20;
block();//輸出20
block中self的循環(huán)引用
block執(zhí)行copy之后,block中使用self味滞,此對象會(huì)被retain一次(注意:在堆區(qū)才起retain作用)樱蛤,會(huì)造成循環(huán)引用。
解決方式
在MRC下剑鞍,用__block修飾
在ARC下昨凡,用unsafe_unretained 或者weak修飾
循環(huán)引用出現(xiàn)的幾種情況
1)NSTimer
NSTimer對象timer作為對象A的屬性,本意在A的dealloc中釋放timer蚁署,但timer沒有停止就不會(huì)觸發(fā)dealloc便脊,然后就互相等待,造成循環(huán)引用形用。
解決辦法:顯示調(diào)用timer的關(guān)閉方法[timer invaluale]就轧,再釋放A對象
2)block塊沒有配合weak使用
3)delegate時(shí)用assign(MRC)或weak(ARC)
4)檢查循環(huán)引用
Xcode -> Product -> Pofile -> Leaks
OC中的反射機(jī)制
1)class反射,通過類名字符串實(shí)例化對象
Class class = NSClassFromString(@“Student”);
Student *student = [[class alloc] init];
2)類名轉(zhuǎn)化為字符串
Class class = [student class];
NSString *calssName = NSStringFromClass(class)田度;
3)SEL的反射
SEL selector = =NSSelectorFromClass(@“setName”)妒御;
[stu performSelector:selector withObject:nil];
4)通過方法字符串形式實(shí)例化方法
NSStringFromSelector(@selector *( “setName:”));
理解一個(gè)對象被創(chuàng)建需要的三個(gè)步驟
開辟內(nèi)存空間,初始化參數(shù)镇饺,返回內(nèi)存地址值
layoutSubView何時(shí)調(diào)用
1)初始化方法時(shí)不會(huì)調(diào)用
2)滾動(dòng)UIScrollview觸發(fā)
3)旋轉(zhuǎn)屏幕時(shí)觸發(fā)
4)改變View的值時(shí)候觸發(fā)乎莉,前提是frame改變了
5)改變UIView的大小時(shí)觸發(fā)
理解OC是動(dòng)態(tài)運(yùn)行時(shí)語言
OC將數(shù)據(jù),對象類型的確定從編譯推遲到運(yùn)行時(shí)。面向?qū)ο笳Z言的多態(tài)性
1)運(yùn)行時(shí)機(jī)制是我們知道運(yùn)行的時(shí)候才確定一個(gè)對象的類型惋啃,以及調(diào)用該類別對象的指定方法哼鬓。
2)多態(tài),不同的對象以自己的方式來響應(yīng)相同的東西边灭,子類的指針可以賦值給父類
Http的狀態(tài)碼
1)302是請求重定向异希。
2)500及以上是服務(wù)器錯(cuò)誤,如503表示服務(wù)器找不到绒瘦、3840表示服務(wù)器返回?zé)o效JSON称簿。
3)400及以上是請求鏈接錯(cuò)誤或者找不到服務(wù)器,如常見的404惰帽。
4)200及以上是正確憨降,如常見的是200表示請求正常。
區(qū)分類別與擴(kuò)展
1)category 為已知的類增加新的方法该酗,類別中擴(kuò)展的方法會(huì)被子類繼承
2)增加原有類的方法授药,而且是可以增加多個(gè)類別將大的功能劃分為小功能
3)類目中的方法會(huì)比原有類中的方法具有更高優(yōu)先級。所以不能和原有類方法重名否則覆蓋
4)擴(kuò)展:即延展呜魄,一般是在一個(gè)類的實(shí)現(xiàn)文件中悔叽。給當(dāng)前類添加私有變量和私有方法。添加的方法是必須實(shí)現(xiàn)的耕赘。
區(qū)分#include骄蝇、#import和@class
1)#include,導(dǎo)入C/C++文件操骡,include相當(dāng)于拷貝文件中的聲明內(nèi)容九火,多次使用就會(huì)報(bào)重復(fù)定義的錯(cuò)誤。
2)#import册招,不會(huì)產(chǎn)生重復(fù)定義的錯(cuò)誤岔激,因?yàn)樗鼤?huì)做一次判斷,如果已經(jīng)導(dǎo)入就不再導(dǎo)入了
3)@class僅僅是類的聲明是掰,告訴編譯器有這么個(gè)類虑鼎,具體這個(gè)類怎么定義一無所知,在編譯的時(shí)候键痛,速度更快炫彩,解決引用循環(huán)依賴死鎖的問題(類的擴(kuò)展,代理設(shè)計(jì)模式)
區(qū)分TCP和UDP
1)TCP:面向連接絮短、傳輸可靠(保證數(shù)據(jù)正確性江兢,保證數(shù)據(jù)順序傳輸)、用于傳輸大量數(shù)據(jù)(流模式)丁频、速度慢杉允,建立連接需要開銷較多邑贴。
2)UDP:面向非連接、傳輸不可靠叔磷、用于傳輸少量數(shù)據(jù)(數(shù)據(jù)包模式)拢驾、速度快,傳輸?shù)氖菆?bào)文改基。
區(qū)分HTTP與Socket
1)HTTP請求:客戶端主動(dòng)發(fā)起請求繁疤,服務(wù)器才能給予響應(yīng),一次請求完畢后則斷開連接秕狰,節(jié)省資源嵌洼。
2)Socket:客戶端與服務(wù)器端直接使用socket套接字連接,雙方保持連接通道封恰,都可以主動(dòng)發(fā)送數(shù)據(jù),適合游戲或股票等這種即時(shí)性很強(qiáng)的要求褐啡。主要使用的類是CFSockdetRef诺舔。
區(qū)分KVC和KVO
1)KVC:值編碼,一種使用字符串標(biāo)識屬性备畦,間接訪問對象屬性的方法低飒。而不是調(diào)用存取方法。
2)KVO:觀察者模式懂盐。通過監(jiān)聽對象的屬性來更新UI或者狀態(tài)褥赊。
區(qū)分define定義的宏和const定義的常量
1)define定義宏的指令,程序在預(yù)處理階段將用#define所定義的內(nèi)容只是進(jìn)行了替換莉恼。程序運(yùn)行時(shí)拌喉,常量表中并沒有用#define所定義的宏,系統(tǒng)并不為它分配內(nèi)存俐银,不會(huì)檢查類型尿背。
2)const定義的常量,在程序運(yùn)行時(shí)是存放在常量表中捶惜,系統(tǒng)會(huì)為它分配內(nèi)存田藐,而且在編譯時(shí)會(huì)進(jìn)行類型檢查。
區(qū)分id與instancetype
1)id:萬能指針吱七,指向任意類型
2)instancetype:只能作為方法的范圍類型汽久,并且返回的類型是當(dāng)前定義類的類型。
區(qū)分通知和代理
1)同:都用于對象之間的通信
2)異:代理是一對一通信踊餐。通知可以一對一景醇,也可以一對多
區(qū)分methord和selector
selector只是一個(gè)方法名,而method包含了方法名和方法實(shí)現(xiàn)市袖。
區(qū)分isKindOfClass 與isMemberOfClass
1)isKindOfClass:確定一個(gè)對象是否是一個(gè)類的成員,或者是派生自該類的成員.
2)isMemberOfClass:確定一個(gè)對象是否是當(dāng)前類的成員.
3)注:isMemberOfClass不能檢測任何的類都是基于NSObject類這一事實(shí)啡直,而isKindOfClass可以烁涌。
區(qū)別面向過程和面向?qū)ο?/h3>
1)面向過程:以事件為編程中心,各功能的實(shí)現(xiàn)是按照事件的先后順序或者因果關(guān)系來展開的編程的一種思想
2)面向?qū)ο螅阂詫ο鬄榫幊痰闹行木泼伲允录轵?qū)動(dòng)撮执,各功能是模塊化的,彼此之間獨(dú)立互不影響的一種編程思想舷丹。
內(nèi)存優(yōu)化的方案
1)首選使用ARC環(huán)境開發(fā)抒钱,但是也要注意防止循環(huán)引用的產(chǎn)生,避免內(nèi)存泄漏
2)懶加載颜凯,延遲創(chuàng)建對象谋币,需要的時(shí)候才創(chuàng)建節(jié)省內(nèi)存消耗
3)復(fù)用,單元格的服用症概,避免過多的創(chuàng)建對象
4)選擇正確的是數(shù)據(jù)結(jié)構(gòu)蕾额,不必要的時(shí)候不使用可變?nèi)萜?5)單例模式
6)及時(shí)刪除緩存信息