iOS开发中的Tips(一)

背景

这几天被<美国总统大选><双十一>的话题讨论着。

第45任美国总统大选,我感觉他们两谁当选美国总统都挺没意思的,他们把太多时间和精力放在了人身攻击上,而没有怎么为国家发展、人民的生活考虑太多。只能说(我说出来会不会坐牢啊?你们不认同可以骂我啊,you happy jiu ok):

特朗普不够靠谱、希拉里不够诚实

Lesser of two evils 两害相权取其轻

任职在电商公司的我,对于双十一只想说剁手就行了_(没毛病)

Lesser of two evils.png

前言

在简书上写了几篇博客,之前在别的平台或自己搭建的博客都写过。怎么说呢,其实写博客就是一个学习的过程,你会收集资料,看别人博客,看官方文档,但是有一点不会变,你看别人的博客时本身就是一个学习的过程,关键博客或者官方文档里面的知识,我学会了,我理解了,这就变成我自己的知识了,这就是我最大的收获!**

我博客里面的知识都是经过我实践验证而来的(当然也有很多理解不透彻的地方),我写博客的目的不外乎两个_

1.督促自己学习,方便查找知识点
2.交朋友,交流技术和看法

我在发开过程中有可能遇到一个个小知识点,有时候不用就会忘记,所以我想记录一下方便以后忘记查找,时间长了用的多了就记住了!每篇博客会更新 6 个Tips,为什么是6个,因为6对于我有很多不解之情。我会持续更新这个Tips哦

学习6个小Tips

那就跟我一起学习小知识点吧.目录如下:

  1. 修改Mac终端(Terminal)里不同类型文件的显示颜色
  2. 修改Mac终端(Terminal)的提示文字
  3. Mac终端显示/隐藏文件命令
  4. 被忽略的dispatch_block_t
  5. NSAssert()和NSParameterAssert()的使用
  6. FOUNDATION_EXPORT的使用

1. 修改Mac终端(Terminal)里不同类型文件的显示颜色

我们开发经常会使用Terminal,可以说频繁使用(推荐终端工具iTem 2,也是我前leader推荐给我的)。很多人认为使用Terminal逼格很高,其实呢就是逼格很高_。Mac OS下ls命令默认是单色输出,如下:

ls单色输出界面.png

我们打开文件~/.bash_profile,添加下面内容,保存文件,重新打开终端运行即可:

export CLICOLOR=1
export LSCOLORS=GxFxCxDxBxegedabagaced

解释:

  • SCLICOLOR是用来设置是否进行颜色的显示。CLI是Command Line Interface的缩写。
  • LSCOLORS是用来设置当CLICOLOR被启用后,各种文件类型的颜色。LSCOLORS的值中每两个字母为一组,分别设置某个文件类型的文字颜色和背景颜色。LSCOLORS中一共11组颜色设置,按照先后顺序,分别对以下的文件类型进行设置(经过我测试有好几个不生效,基本够用):
directory 这是一个目录
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 bit 
directory writable to others, without sticky bit 

 LSCOLORS中,字母代表的颜色如下: 
 a 黑色 
 b 红色 
 c 绿色 
 d 棕色 
 e 蓝色 
 f 洋红色 
 g 青色 
 h 浅灰色 
 A 黑色粗体 
 B 红色粗体 
 C 绿色粗体 
 D 棕色粗体 
 E 蓝色粗体 
 F 洋红色粗体 
 G 青色粗体 
 H 浅灰色粗体 
 x 系统默认颜色 
ls 多色输出界面.png

2. 修改Mac终端(Terminal)的提示文字

环境变量PS1就是终端的提示文字格式,默认为“\\h:\\W \\u\\$”,可以用echo来查看:
echo $PS1
PS2则是换行后的提示符,默认为“>”。
部分可使用的格式有:

\\d – 现在的系统日期 
\\t – 现在的系统时间 
\\h – 主机名 
\\\\# – 命令号(Comannd Number) 
\\u – 用户名 
\\W – 当前所在的路径 
\\w – 当前所在的完整路径 

如只想显示命令号,可以输入如下命令:

PS1="\\#: " 
改成Linux风格可运行: 
PS1="[\\u@\\h \\W]\\$ " 

但是退出后这些环境变量就丢失了,要永久生效的话,可以在~/.bash_profile~/.profile/etc/profile(需要管理员权限)里进行设置,保存文件,重新打开终端: 你们可以自定义自己想显示的

echo 'PS1="[\\u \\W] Comannd \\\\# >>> "' >> ~/.bash_profile 
终端提示文字修改.png

3. Mac终端显示/隐藏文件命令

在开发过程中经常会修改隐藏文件,比如上面的.bash_profile.gitignore等等,我们可以

用命令 ls -a  查看所有文件(包含隐藏文件),
用命令 pbcopy < . gitignore  拷贝文件的内容
用命令 echo 'PS1="[\\u \\W] Comannd \\# >>> "' >> ~/.bash_profile 写入内容

当然我们可以再mac下显示和隐藏所有隐藏文件:
<pre>
显示 Mac 隐藏文件的命令:
defaults write com.apple.finder AppleShowAllFiles -bool true

隐藏 Mac 隐藏文件的命令:
defaults write com.apple.finder AppleShowAllFiles -bool false
</pre>

4. 被忽略的dispatch_block_t

我们经常在开发中定义一个回调block,既没有参数也没有返回值。我们会在项目里这样定义 :

typedef void (^myBlock)(void);
或者
- (void)getTimeWithBlock:(void (^)(void))myBlock;

但是系统已经有一个帮我们定义了一个这样的block,只是我们忽略了,那就是

dispatch_block_t定义如下:
typedef void (^dispatch_block_t)(void);

我建议如果遇到需要这样的block,那就直接使用这个block,简单方便。反正我不会再自己定义了!

5. NSAssert()和NSParameterAssert()的使用

我们在开发中对于对象经常为nil或者条件不满足,而导致程序出现bug或者崩溃,我们还不好定位那里出现了问题,现在我就简单介绍NSAssert()NSParameterAssert()抛出异常来定位这种问题的出现。

  • NSAssert()

NSAssert()是个宏,用于开发阶段调试程序中的Bug,通过为NSAssert()传递条件表达式来断定是否属于Bug,满足条件返回真值,程序继续运行,如果返回假值,则抛出异常,并且可以自定义异常描述,NSAssert()可以出现在程序的任何一个位置。

 #define NSAssert(condition, desc);可以点击进去看下如何定义的
 用法:
 NSString *name;
 NSAssert([name isEqualToString:@"Dely"],@"名字必须为Dely哦");

异常信息:定位到问题类的某一行

2016-11-11 18:18:34.598 RuntimeDemo[1415:64564] *** Assertion failure in -[ViewController viewDidLoad], /Users/admin/Desktop/Projects/RuntimeDemo/RuntimeDemo/ViewController.m:23
2016-11-11 18:18:34.601 RuntimeDemo[1415:64564] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '名字必须为Dely哦'

NSAssertassert都是断言,主要的差别是assert在断言失败的时候只是简单的终止程序,而NSAssert会报告出错误信息并且打印出来.所以只使用NSAssert就好,可以不去使用assert。

NSAssertNSCAssert区别不大,作用都是一样。一个定义oc的,一个定义c的。都可以使用!具体宏定义大家可以点击进去看。

  • NSParameterAssert()

NSParameterAssert()也是一个宏定义,它只是针对参数是否存在的断言。

用法:
NSString *name;
NSParameterAssert(name);

异常信息:定位到问题类的某一行

2016-11-11 18:14:49.598 RuntimeDemo[1398:62095] *** Assertion failure in -[ViewController viewDidLoad], /Users/admin/Desktop/Projects/RuntimeDemo/RuntimeDemo/ViewController.m:22
2016-11-11 18:14:49.601 RuntimeDemo[1398:62095] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid parameter not satisfying: name'

NSParameterAssertNSCparameterAssert 两者的区别也是前者适用于Objective-C的方法,后者适用于C的函数。

Xcode 已经默认将release环境下的断言取消了, 免除了忘记关闭断言造成的程序不稳定. 所以不用担心 在开发时候大胆使用。

断言开启.png

总结:NSAssert/NSCAssertNSParameterAssert/NSCparameterAssert 的区别是前者是针对条件断言, 后者只是针对参数是否存在的断言。

6. FOUNDATION_EXPORT的使用

我们经常开发的时候会定义一些常量之类的,我们会用到** #define**比如:

#define AFURLSessionDidInvalidateNotification @"com.alamofire.networking.session.invalidate"

而是用FOUNDATION_EXPORT如下:

//.h定义
FOUNDATION_EXPORT NSString \\* const AFURLSessionDidInvalidateNotification;

//.m赋值
NSString * const AFURLSessionDidInvalidateNotification = @"com.alamofire.networking.session.invalidate";

使用FOUNDATION_EXPORT方法在检测字符串的值是否相等的时候效率更快.
可以直接使用(string == AFURLSessionDidInvalidateNotification)来比较, 而#define则使用的是([string isEqualToString: AFURLSessionDidInvalidateNotification])哪个效率更高,显而易见了

FOUNDATION_EXPORT是直接比较指针地址
#define是一一比较字符串的每一个字符是否相等.

我们要多使用FOUNDATION_EXPORT

结尾:

今天讲解的都是很简单的Tips,希望在开发中多多使用,提升开发效率哦。

我会持续更新Tips的(除非我转职业了),如果对你有帮助。希望点个喜欢加个关注哦_

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,012评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,589评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,819评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,652评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,954评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,381评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,687评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,404评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,082评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,355评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,880评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,249评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,864评论 3 232
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,007评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,760评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,394评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,281评论 2 259

推荐阅读更多精彩内容