背景
這幾天被和的話題討論著。
第45任美國總統大選,我感覺他們兩誰當選美國總統都挺沒意思的,他們把太多時間和精力放在了人身攻擊上,而沒有怎麼為國家發展、人民的生活考慮太多。只能說(我說出來會不會坐牢啊?你們不認同可以罵我啊,you happy jiu ok):
川普不夠靠譜、希拉蕊不夠誠實
Lesser of two evils 兩害相權取其輕
任職在電商公司的我,對於雙十一隻想說剁手就行了^_^(沒毛病)
前言
在簡書上寫了幾篇部落格,之前在別的平臺或自己搭建的部落格都寫過。怎麼說呢,其實寫部落格就是一個學習的過程,你會收集資料,看別人部落格,看官方文件,但是有一點不會變,你看別人的部落格時本身就是一個學習的過程,關鍵部落格或者官方文件裡面的知識,我學會了,我理解了,這就變成我自己的知識了,這就是我最大的收穫!**
我部落格裡面的知識都是經過我實踐驗證而來的(當然也有很多理解不透徹的地方),我寫部落格的目的不外乎兩個^_^:
1.督促自己學習,方便查詢知識點
2.交朋友,交流技術和看法
我在發開過程中有可能遇到一個個小知識點,有時候不用就會忘記,所以我想記錄一下方便以後忘記查詢,時間長了用的多了就記住了!每篇部落格會更新 6 個Tips,為什麼是6個,因為6對於我有很多不解之情。我會持續更新這個Tips哦
學習6個小Tips
那就跟我一起學習小知識點吧.目錄如下:
- 修改Mac終端(Terminal)裡不同型別檔案的顯示顏色
- 修改Mac終端(Terminal)的提示文字
- Mac終端顯示/隱藏檔案命令
- 被忽略的dispatch_block_t
- NSAssert()和NSParameterAssert()的使用
- FOUNDATION_EXPORT的使用
1. 修改Mac終端(Terminal)裡不同型別檔案的顯示顏色
我們開發經常會使用Terminal,可以說頻繁使用(推薦終端工具iTem 2,也是我前leader推薦給我的)。很多人認為使用Terminal逼格很高,其實呢就是逼格很高^_^。Mac OS下ls
命令預設是單色輸出,如下:
我們開啟檔案~/.bash_profile
,新增下面內容,儲存檔案,重新開啟終端執行即可:
1 2 |
export CLICOLOR=1 export LSCOLORS=GxFxCxDxBxegedabagaced |
解釋:
SCLICOLOR
是用來設定是否進行顏色的顯示。CLI是Command Line Interface的縮寫。LSCOLORS
是用來設定當CLICOLOR被啟用後,各種檔案型別的顏色。LSCOLORS的值中每兩個字母為一組,分別設定某個檔案型別的文字顏色和背景顏色。LSCOLORS中一共11組顏色設定,按照先後順序,分別對以下的檔案型別進行設定(經過我測試有好幾個不生效,基本夠用):
1234567891011121314151617181920212223242526272829directory 這是一個目錄symbolic link 這是一個符號連結socket 這是一個socket連結pipe 這是一個管道executable 這是一個可執行檔案block special 這是一個字元特殊檔案character special 這是一個塊特殊檔案executable with setuid bit set 可執行以不同的UID執行的程式executable with setgid bit set 可執行以一個額外的組特權執行的程式directory writable to others, with sticky bitdirectory writable to others, without sticky bitLSCOLORS中,字母代表的顏色如下:a 黑色b 紅色c 綠色d 棕色e 藍色f 洋紅色g 青色h 淺灰色A 黑色粗體B 紅色粗體C 綠色粗體D 棕色粗體E 藍色粗體F 洋紅色粗體G 青色粗體H 淺灰色粗體x 系統預設顏色
2. 修改Mac終端(Terminal)的提示文字
環境變數PS1
就是終端的提示文字格式,預設為“\h:\W \u\$”
,可以用echo來檢視:
echo $PS1
PS2
則是換行後的提示符,預設為“>”。
部分可使用的格式有:
1 2 3 4 5 6 7 |
\d – 現在的系統日期 \t – 現在的系統時間 \h – 主機名 \\# – 命令號(Comannd Number) \u – 使用者名稱 \W – 當前所在的路徑 \w – 當前所在的完整路徑 |
如只想顯示命令號,可以輸入如下命令:
PS1=”\#: “
改成Linux風格可執行:
PS1=”[\u@\h \W]\$ “
但是退出後這些環境變數就丟失了,要永久生效的話,可以在~/.bash_profile
、~/.profile
或/etc/profile
(需要管理員許可權)裡進行設定,儲存檔案,重新開啟終端: 你們可以自定義自己想顯示的
1 |
echo 'PS1="[\u \W] Comannd \\# >>> "' >> ~/.bash_profile |
3. Mac終端顯示/隱藏檔案命令
在開發過程中經常會修改隱藏檔案,比如上面的.bash_profile
、.gitignore
等等,我們可以
1 2 |
用命令 ls -a 檢視所有檔案(包含隱藏檔案), 用命令 pbcopy 用命令 echo 'PS1="[\u \W] Comannd \# >>> "' >> ~/.bash_profile 寫入內容 |
當然我們可以再mac下顯示和隱藏所有隱藏檔案:
1 2 3 4 |
顯示 Mac 隱藏檔案的命令: defaults write com.apple.finder AppleShowAllFiles -bool true 隱藏 Mac 隱藏檔案的命令: defaults write com.apple.finder AppleShowAllFiles -bool false |
4. 被忽略的dispatch_block_t
我們經常在開發中定義一個回撥block,既沒有引數也沒有返回值。我們會在專案裡這樣定義 :
1 2 3 |
typedef void (^myBlock)(void); 或者 \- (void)getTimeWithBlock:(void (^)(void))myBlock; |
但是系統已經有一個幫我們定義了一個這樣的block,只是我們忽略了,那就是
1 2 |
dispatch_block_t定義如下: typedef void (^dispatch_block_t)(void); |
我建議如果遇到需要這樣的block,那就直接使用這個block,簡單方便。反正我不會再自己定義了!
5. NSAssert()和NSParameterAssert()
的使用
我們在開發中對於物件經常為nil或者條件不滿足,而導致程式出現bug或者崩潰,我們還不好定位那裡出現了問題,現在我就簡單介紹NSAssert()
和NSParameterAssert()
丟擲異常來定位這種問題的出現。
- NSAssert()
NSAssert()是個巨集,用於開發階段除錯程式中的Bug,通過為NSAssert()傳遞條件表示式來斷定是否屬於Bug,滿足條件返回真值,程式繼續執行,如果返回假值,則丟擲異常,並且可以自定義異常描述,NSAssert()可以出現在程式的任何一個位置。
1 2 3 4 |
#define NSAssert(condition, desc);可以點選進去看下如何定義的 用法: NSString *name; NSAssert([name isEqualToString:@"Dely"],@"名字必須為Dely哦"); |
異常資訊:定位到問題類的某一行
1 2 |
2016-11-11 18:18:34.598 RuntimeDemo[1415:64564] <strong><em> Assertion failure in -[ViewController viewDidLoad], /Users/admin/Desktop/Projects/RuntimeDemo/RuntimeDemo/ViewController.m:23 2016-11-11 18:18:34.601 RuntimeDemo[1415:64564] </em></strong> Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '名字必須為Dely哦' |
NSAssert
和assert
都是斷言,主要的差別是assert在斷言失敗的時候只是簡單的終止程式,而NSAssert會報告出錯誤資訊並且列印出來.所以只使用NSAssert就好,可以不去使用assert。
NSAssert
和NSCAssert
區別不大,作用都是一樣。一個定義oc的,一個定義c的。都可以使用!具體巨集定義大家可以點選進去看。
- NSParameterAssert()
NSParameterAssert()也是一個巨集定義,它只是針對引數是否存在的斷言。
1 2 3 |
用法: NSString *name; NSParameterAssert(name); |
異常資訊:定位到問題類的某一行
1 2 |
2016-11-11 18:14:49.598 RuntimeDemo[1398:62095] <strong><em> Assertion failure in -[ViewController viewDidLoad], /Users/admin/Desktop/Projects/RuntimeDemo/RuntimeDemo/ViewController.m:22 2016-11-11 18:14:49.601 RuntimeDemo[1398:62095] </em></strong> Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid parameter not satisfying: name' |
NSParameterAssert
和NSCparameterAssert
兩者的區別也是前者適用於Objective-C的方法,後者適用於C的函式。
Xcode 已經預設將release環境下的斷言取消了, 免除了忘記關閉斷言造成的程式不穩定. 所以不用擔心 在開發時候大膽使用。
總結:NSAssert/NSCAssert
和 NSParameterAssert/NSCparameterAssert
的區別是前者是針對條件斷言, 後者只是針對引數是否存在的斷言。
6. FOUNDATION_EXPORT
的使用
我們經常開發的時候會定義一些常量之類的,我們會用到 #define比如:
1 |
#define AFURLSessionDidInvalidateNotification @"com.alamofire.networking.session.invalidate" |
而是用 FOUNDATION_EXPORT 如下:
1 2 3 4 |
//.h定義 FOUNDATION_EXPORT NSString \<em> const AFURLSessionDidInvalidateNotification; //.m賦值 NSString </em> const AFURLSessionDidInvalidateNotification = @"com.alamofire.networking.session.invalidate"; |
使用FOUNDATION_EXPORT方法在檢測字串的值是否相等的時候效率更快.
可以直接使用(string == AFURLSessionDidInvalidateNotification)
來比較, 而#define則使用的是([string isEqualToString: AFURLSessionDidInvalidateNotification])
哪個效率更高,顯而易見了
FOUNDATION_EXPORT
是直接比較指標地址
#define
是一一比較字串的每一個字元是否相等.
我們要多使用 FOUNDATION_EXPORT 哦
結尾:
今天講解的都是很簡單的Tips,希望在開發中多多使用,提升開發效率哦。
我會持續更新Tips的(除非我轉職業了),如果對你有幫助。希望點個喜歡加個關注哦^_^