iOS开发中的Tips(一)

背景

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

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

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

Lesser of two evils 两害相权取其轻

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

iOS开发中的Tips(一)_第1张图片
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命令默认是单色输出,如下:

iOS开发中的Tips(一)_第2张图片
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 系统默认颜色 
iOS开发中的Tips(一)_第3张图片
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 
iOS开发中的Tips(一)_第4张图片
终端提示文字修改.png

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

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

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

当然我们可以再mac下显示和隐藏所有隐藏文件:


显示 Mac 隐藏文件的命令:
defaults write com.apple.finder AppleShowAllFiles -bool true

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

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环境下的断言取消了, 免除了忘记关闭断言造成的程序不稳定. 所以不用担心 在开发时候大胆使用。

iOS开发中的Tips(一)_第5张图片
断言开启.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的(除非我转职业了),如果对你有帮助。希望点个喜欢加个关注哦_

你可能感兴趣的:(iOS开发中的Tips(一))