天天看點

iOS開發中的零碎知識點筆記 韓俊強的部落格

新浪微網誌

1.關聯

objc_setAssociatedObject關聯是指把兩個對象互相關聯起來,使得其中的一個對象作為另外一個對象的一部分。

2.tableView的beginUpdates

和 endUpdates

3.關于代碼與storyBoard的自動布局

4.國際化與本地化,為了實作全球化

5.技巧

可以通過設定Scheme來設定app所運作的語言,你想要什麼語言就是什麼語言,而不用重新設定系統的語言。

6.ios8新特性,加載js

如果我想要加載一個形如網頁的東西,那麼我需要對整個網頁進行動态的編輯,圖文混編,但是這樣做那面會帶來很困難的操作,其實服務端那邊很好的可以解決這個問題,用一個網頁即可以搞定。服務端那邊隻需傳回一個html文檔,然後用戶端根據這個html文檔進行解析即可。

WKWebView新特性:

在性能、穩定性、功能方面有很大提升(最直覺的展現就是加載網頁是占用的記憶體,模拟器加載百度與開源中國網站時,WKWebView占用23M,而UIWebView占用85M);

允許JavaScript的Nitro庫加載并使用(UIWebView中限制);

支援了更多的HTML5特性;

高達60fps的滾動重新整理率以及内置手勢;

将UIWebViewDelegate與UIWebView重構成了14類與3個協定

7.技巧

寫函數的時候一定要判斷資料的安全性,這樣出錯的幾率就會很小,尤其是要判斷它的類型安全,是否為空等,不然程式會奔潰。還有需要注意的地方就是,寫每一個函數的時候要多方面進行考慮,考慮代碼的合法性。使用前不判斷參數的正确性,在函數内部對參數的可靠性進行判斷。如果這樣的話,你用到函數的時候都需要對這些參數進行判斷其合法性如果放倒函數中那麼隻需要判斷一次就可以了。

8.應用内購買

9.sqlite

利用sqlite建立索引,索引是關系資料庫中用于存放每一條記錄的一種對象,主要目的是加快資料的讀取速度和完整性檢查。索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可快速通路資料庫表中的特定資訊。

10.資料庫版本的更新,當應用資料表需要添加新表的時候,需要對資料插入新的字段,那麼久需要更新資料庫

11.友盟統計

當應用上線後可以觀察到應用的日志檔案,crash日志,頁面記時日志,收集并歸類崩潰日志,提供錯誤管理及分析工具,幫助開發者更好的解決問題,進而提高應用的穩定性,改善應用品質。

12.可以擷取手機上的語言?你知道嗎

13.使用js的時候需要使用webView

14.做常用裝置登陸的政策可以使用伺服器,伺服器把所有登陸過的裝置都存儲下來。

15.涉及到系統偏好設定的選項,把它都放到一個檔案中,這樣修改起來比較容易。

16.利用VVDocumenter-Xcode

自動生成注釋,也就是xcode的插件.運作VVDOcumenter-Xcode編譯後,重新打開xcode即可以使用了

17.如何使用xib進行界面的搭建

利用file’s owner進行關聯,形如storyBoard中的segue

18.如何在一個項目中使用多個storyBoard

19.如何利用代碼與storyBoard或者XIB進行自動布局

20、XIB進行國際化

首先在工程中需要添加你想要使用的語言,然後建立視圖的時候選擇使用XIB,這樣xcode就會自動為你建立一個xib檔案,然後在inspector中的localization中選擇localized,開始時一定要選擇base,然後勾選其他語言,這樣你發現XIB檔案會有子目錄,然後在子目錄下你可以設定不同的語言翻譯。

21.tableView小技巧

根據設定不同的identifier取出不同類型的cell,在設定identifier的時候可以設定成類名,這樣的話就可以省很多事,而且很友善。

22.

技巧

23.版本控制

gitLab和sourceTree結合使用對源代碼進行管理,如何進行相關的配置

24.發送語音消息

三方庫opencore-amr

25.Sqlcipher+FMDB,資料庫檔案加密

<a target="_blank" href="https://www.zetetic.net/sqlcipher/ios-tutorial/">https://www.zetetic.net/sqlcipher/ios-tutorial/</a>

26.技巧

圖檔浏覽XHImageViewer

28.技巧

根據button的不同狀态可以設定button的事件,相當于微信發送語音資訊的按鈕,按住錄音,松開結束錄音并發送消息,

29.技巧

把block指針變量設定成私有的,這樣是不是很好用。

30.功能說明

1

先看這段代碼:

為什麼[self performSelector:@selector(showLeft)];前面還需要調用cancelPreviousPerformRequestsWithTarget:self方法呢?

那是因為有時候我們通過[self performSelector:@selector(showLeft)];來實作showLeft方法,可能會出現延遲執行或記憶體洩漏的問題,而前面加上這句話:

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(showLeft) object:nil];

可以先将這在執行的方法取消,在繼續執行,有效避免了上述兩個問題。

31.runLoop

關于runloop的一些了解,runloop是一種運作池,是和多線程有關的東西,監聽事件的産生,如果有新事件,那麼runloop會監聽,一旦監聽到了,就會執行監聽到的方法。

32.技巧

關于使用者頭像的問題,點選放大,等其他手勢的庫ESImageViewController

33.技巧

把數組中的每個元素用逗号拼接成一個字元串

34.資料共享

Multipeer Connectivity Framework ,近距離通信,雙方建立連接配接後可以彼此進行通信

35.問題

oc中不支援多繼承,也就說一個類隻能繼承至一個類,不能繼承多個類。實作多繼承可以使用協定來實作,也就說某個類中可以繼承多個協定,這久相當于多繼承,我可以擁有很多協定并且實作它。

36.multipeerConnectivity的實作,對檔案進行共享

37.indexPathForSelectedRow

38.如何給另一台電腦進行真機調試

《1》導出p12檔案

《2》導出描述檔案

《3》在另一台電腦上輕按兩下即可以安裝了

39.問題

找不到檔案目錄,[NSBundle mainBundle]其擷取的路徑是你程式的安裝路徑下的資源檔案位置。 在xcode中采用add file to 方式添加檔案時,一般情況下xcode會自動将檔案添加到你的資源檔案,而且,這些檔案在你工程的 build Phases中的 copy Bundle Resources中可以檢視到。但是有時候,由于xcode的問題,采用add files to 不能自動添加到你的資源檔案中,這時,可以采用copy Bundle Resources下面的“+”号,手動将檔案添加到你的資源檔案中,這樣就可以解決問題了。

40.功能實作

實作檔案的一些操作,包括檔案的近距離通信,MC,AirDrop,檔案預覽

41.Uniform

Type Identifiers (UTIs)統一标示符(UTIs)

當你把圖檔分享之其他iOS裝置,接收方會自動打開拍照類app并加載圖檔。如果你傳遞的是PDF檔案,接收方裝置可能會提示你選擇一個app來打開檔案,或者直接在iBooks中打開。iOS是如何知道哪個app适合什麼樣的資料類型呢?

在系統中,蘋果用UTIs來處理資料類型的标示。簡單的說,一個uti是用來标示特定類型的資料或檔案。例如,com.adobe.pdf标示一個pdf檔案,而public.png代表一個PNG圖檔。在這裡可以檢視已經在系統中注冊了的完整的UTIs清單。(love cc cat)應用程式可以打開在iOS系統中已經注冊了的UTI。是以無論檔案是否被打開,iOS都會用特定的程式打開這個檔案。

42.關于info.plist檔案的操作

43.URL

Scheme

是類似http://,ftp://,afp://這樣的東西,通常是用傳輸協定作為URL Scheme。不過事實上,你可以在iOS和Mac中注冊任何類型的URL Scheme。當使用者在浏覽器中通路你的自定義URL Scheme的連結的時候,作業系統就會打開你的程式,響應這個請求。

要在程式中注冊自定義URL Scheme非常簡單。主要分為兩個步驟:在程式的Info.plist中加入你需要注冊的URL Scheme,然後在你的應用程式中加入處理這類請求的代碼。

其中,第一個步驟對于iOS和Mac應用程式來說是完全相同的。方法如下:

在Info.plist中,增加一個字段,名稱為CFBundleURLTypes(URL Types)。Xcode會自動為你建立一個必須的鍵:URL Identifier(CFBundleURLName),這個鍵的值可以指派為一個唯一的字元串。通常是逆向的域名結構,如:me.venj.myapp。然後在URL Types這個鍵下增加一個子項:CFBundleURLSchemes(URL Schemes),這裡填入你想注冊的URL Scheme的名稱,如:cloud。你可以增加多個URL

Scheme。

44.在我的APP中打開其他的App

那怎樣來制作從一個應用打開其他應用,這其實很簡單,打開info.plist,添加一項URL types,展開URL types,再展開Item1,将Item1下的URL identifier修改為URL Scheme,展開URL Scheme,将Item1的内容修改為myapp其他程式可通過myapp://通路此自定義URL。其實就是類似下面的樣式。

<a target="_blank" href="https://appsto.re/cn/YSJRZ.i">https://appsto.re/cn/YSJRZ.i</a>

45.問題

添加限制後,當想改變限制的時候,可以更具限制獲得限制的值。比如我設定了高的限制是20,那麼我以後想把高的限制改為40,那我咋麼辦,我需要根據這個限制進行修改。或者我需要根據某個限制擷取起限制的值,那麼我也需要根據限制來獲得它的值。

46.關于自動布局修改限制

如果給一個視圖添加了限制,你可以修改限制,來改變之前所添加的限制

ContentHightConstraint.constant = 150; 修改之前的限制

47.用通知中心的缺點别人看代碼比較

48.問題

NSTimer不能歸檔持久化,隻有實作了NScode協定的才能持久化,即使是歸檔也不好使,不知道有沒有一種方法可以進行序列化

49.技巧

在iOS7之後我們可以用UIFont的preferredFontForTextStyle:類方法來指定一個樣式,并讓字型大小符合使用者設定的字型大小。通過手機設定app字型的大小。目前可供選擇的有六種樣式:

50.mac終端指令

vi 檔案名

q!強制退出

i編輯模式

esc commend 模式 shift +double click z 儲存并推出

cat 檔案名,檢視檔案内容

51.Debug的一些有用的操作

截取螢幕圖,debug---》view debugging ——&gt;take screenshot of iPhone

檢視view的frame  debug ——&gt; show view frame

52.真正懂得自動布局嗎?

自動布局會自動根據限制進行計算view的frame,是以你添加的限制必須保證能正常就算出view的frame,如果不能那麼你就需要添加限制,也就是說,你既不能多添加了限制也不能少添加限制,UILAbel如果不添加高度限制,它會自動幫你計算出高度的。總的來說,隻要讓自動布局知道視圖的frame就行。如果不能知道,那麼會報錯

42.你的視圖有比較簡單的布局改變

當需要産生動畫或動态添加視圖時,autolayout就暴露了出我認為讓人抓狂的元兇——優先級(Priority)和布局沖突。 autolayout對于相同方位的限制,如都是描述離superview上邊緣距離的限制,如果這兩個限制的數值不同,但是優先級一樣,則 autolayout将報布局沖突,将會根據其計算丢棄某一條限制(這時可能就會丢棄你想要的限制,而恰恰保留了你不想看到的布局)。是以,當我們發生布 局變化時,無法像frame的絕對定位,直接改變,并且隻有唯一的位置資訊。那麼,我們該怎麼處理這種布局沖突呢?那就是讓描述相同但數值不同的這兩個約

束采用不同的優先級。autolayout預設将使用數值較大的優先級限制。?但是當我們新增了一個更高優先級限制改變了視圖布局,在完成一些操作後,又想變回去怎麼辦?這時就必須删除更高優先級的限制。?是以,對于視圖有動态變更時,我的通常做法是:為需要變更的控件新增預設constraint,但對于這個預設constraint先降低優先級,在發生 變化時再新增一個更高優先級的constraint2,且代碼中用一個Dictionary緩存該constraint2的對象,便于我随時删除或重新新 增,讓視圖來回變化。

53.AD-hoc

是幹什麼的

是在把app釋出到store上進行測試用的。也就是說我把對方裝置好添加進來,我打一個包給對方,對方就可以通過itune安裝這個ipa檔案,就可以進行真機測試了,不需要通過xcode進行安裝了。

54.枚舉的定義方法

55.如果頁面上的資料是在服務端,且服務端的資訊可能會随時改變。那麼我們需要把每次請求資料確定每次的資料是最行的資料。但是每次加載資料是不難免會很影響使用者體驗,是以我需要本地緩存資料。頁面先加載本地資料,然後在進行網絡請求加載資料。等網絡請求資料成功以後,在把新加載進來的資料更新UI

56.資料庫的一些操作

57.uitextView擷取光标的位置