工作之余,總結一下這幾年IOS開發知識點。
1. NSString為什么要用copy關鍵字,用strong會有什么問題
對源頭是NSMutableString的字符串,strong僅僅是指針引用,增加了引用計數器,這樣源頭改變的時候,用這種strong方式聲明的變量(無論被賦值的變量是可變的還是不可變的),它也會跟著改變;而copy聲明的變量,它不會跟著源頭改變,它實際上是深拷貝。
對源頭是NSString的字符串,無論是strong聲明的變量還是copy聲明的變量,當第二次源頭的字符串重新指向其它的地方的時候,它還是指向原來的最初的那個位置,也就是說其實二者都是指針引用,也就是淺拷貝。
另外說明一下,這兩者對內存計數的影響都是一樣的,都會增加內存引用計數,都需要在最后的時候做處理。
其實說白了,對字符串為啥要用這兩種方式?我覺得還是一個安全問題,比如聲明的一個NSString *mStr變量,然后把一個NSMutableString *str變量的賦值給它了,如果要求mStr跟著str變化,那么就用strong;如果mStr不能跟著str一起變化,那就用copy。而對于要把NSString類型的字符串賦值給mStr,那兩都沒啥區別。不會影響安全性,內存管理也一樣。
2. iOS持久化方式有哪些
因為iOS的沙盒機制,所以持久化分為兩類:沙盒內和沙盒外。
沙盒內:
NSKeyedArchiver? 遵循了NSCoding協議 歸檔解檔
NSUserDefaults? ? ?
plist? ??
數據庫sqlite3
沙盒外:
KeyChain
沙盒內的方式在應用被刪除后數據都會丟失,如果想要不丟失則需要使用KeyChain。
KeyChain本質是一個sqlite數據庫,其保存的所有數據都是加密過的。
KeyChain分為私有和公有,公有則需要指定group,一個group中的應用可以共享此KeyChain。
使用KeyChain過程中要理解下面幾個問題:
1:自己使用的KeyChain和系統自帶的KeyChain數據是隔離的,內部應該是不同數據庫文件;
2:KeyChain數據可備份到iCloud中;
3:不需要聯網,也不用登陸iCloud賬號;一個設備一個sqlite數據庫,但是不同應用組不共享數據;
4:要在另一臺設備上使用當前設備存儲的KeyChain信息,需要當前設備進行數據備份,
再在另一設備上復原數據;比較常用的是iCloud備份方式;
5:系統自帶的KeyChain中賬號密碼分類數據可在系統設置->賬號與密碼里面看到,
你退出iCloud賬號還是存在,只是iCloud會幫你備份如果你設置了的話;這個和照片是一樣的道理。
3.?id和NSObject*的區別
id可以指向oc中的任何對象,而NSObject*只能指向NSObject及子類對象。
4. runtime是什么
http://www.lxweimin.com/p/19f280afcb24
5. KVC/KVO
https://blog.csdn.net/yuwuchaio/article/details/80701681
6.?Property修飾符
https://blog.csdn.net/shenzhonglaoxu/article/details/47807081