iOS 开发中的 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命令默认是单色输出,如下:

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 用命令 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] <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()也是一个宏定义,它只是针对参数是否存在的断言。
用法:
NSString *name;
NSParameterAssert(name);
异常信息:定位到问题类的某一行
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环境下的断言取消了, 免除了忘记关闭断言造成的程序不稳定. 所以不用担心 在开发时候大胆使用。

断言开启.png
总结:NSAssert/NSCAssert和 NSParameterAssert/NSCparameterAssert 的区别是前者是针对条件断言, 后者只是针对参数是否存在的断言。
6. FOUNDATION_EXPORT的使用
我们经常开发的时候会定义一些常量之类的,我们会用到 #define比如:
#define AFURLSessionDidInvalidateNotification @"com.alamofire.networking.session.invalidate"
而是用 FOUNDATION_EXPORT 如下:
//.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,希望在开发中多多使用,提升开发效率哦。
iOS 开发中的 Tips(一)的更多相关文章
- iOS 开发中一些 tips
		
tableView 的 tableHeaderView 高度不正确的问题: func forceRefreshHeader() { let size = headerView.systemLayout ...
 - ios开发中的小技巧
		
在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新. UITableView的Group样式下顶部空白处理 //分组列表头部空白处理 UIView *view = [[UIViewal ...
 - fir.im Weekly - iOS开发中的Git流程
		
本期 fir.im Weekly 收集了微博上的热转资源,包含 Android.iOS 开发工具.源码等好用的轮子,还有一些 APP 设计的 Tips,希望对你有用. 精仿知乎日报 iOS 端 @我偏 ...
 - 总结iOS开发中的断点续传那些事儿
		
前言 断点续传概述 断点续传就是从文件赏赐中断的地方重新开始下载或者上传数据,而不是从头文件开始.当下载大文件的时候,如果没有实现断点续传功能,那么每次出现异常或者用户主动的暂停,都会从头下载,这样很 ...
 - iOS开发中静态库之".framework静态库"的制作及使用篇
		
iOS开发中静态库之".framework静态库"的制作及使用篇 .framework静态库支持OC和swift .a静态库如何制作可参照上一篇: iOS开发中静态库之" ...
 - iOS开发中静态库制作 之.a静态库制作及使用篇
		
iOS开发中静态库之".a静态库"的制作及使用篇 一.库的简介 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的类型? 根据源代码的公开情况,库可以分为2种类 ...
 - IOS 开发中  Whose view is not in the window hierarchy  错误的解决办法
		
在 IOS 开发当中经常碰到 whose view is not in the window hierarchy 的错误,该错误简单的说,是由于 "ViewController" ...
 - [转]iOS开发中的火星坐标系及各种坐标系转换算法
		
iOS开发中的火星坐标系及各种坐标系转换算法 源:https://my.oschina.net/u/2607703/blog/619183 其原理是这样的:保密局开发了一个系统,能将实际的坐标转 ...
 - iOS开发中常见问题集锦
		
在iOS开发中,会出现各种各样的问题.今天,就把这些常见的问题以及各位大牛的解决方案汇总下,方便以后查阅: 常见错误: 1. linker command failed with exit code ...
 
随机推荐
- FastText 文本分类使用心得
			
http://blog.csdn.net/thriving_fcl/article/details/53239856 最近在一个项目里使用了fasttext[1], 这是facebook今年开源的一个 ...
 - ICTCLAS中的HMM人名识别
			
http://www.hankcs.com/nlp/segment/ictclas-the-hmm-name-recognition.html 本文主要从代码的角度分析标注过程中的细节,理论谁都能说, ...
 - Linux动态链接库的使用
			
1.前言 在实际开发过程中,各个模块之间会涉及到一些通用的功能,比如读写文件,查找.排序.为了减少代码的冗余,提高代码的质量,可以将这些通用的部分提取出来,做出公共的模块库.通过动态链接库可以实现多个 ...
 - 怎样将 MySQL 迁移到 MariaDB 上
			
自从甲骨文收购 MySQL 后,由于甲骨文对 MySQL 的开发和维护更多倾向于闭门的立场,很多 MySQL 的开发者和用户放弃了它.在社区驱动下,促使更多人移到 MySQL 的另一个叫 MariaD ...
 - DOM对象操作html元素1
			
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
 - SharpDX之Direct2D教程I——简单示例和Color(颜色)
			
研究Direct2D已经有一段时间了,也写了一个系列的文章 Direct2D ,是基于Windows API Code Pack 1.1.在前文 Direct2D教程VIII——几何(Geometry ...
 - stl 迭代器失效
			
1.对于基于连续内存的容器,容器元素的增删,有可能会导致迭代器的失效.考虑: int main(int argc, char* argv[]) { vector<int> intVec; ...
 - FastDFS_v4.06+nginx-1.4.2配置详解
			
径不带group名(storage只有一个group的情况),如/M00/00/00/xxx: location /M00 { ngx_fastdfs_module; ...
 - git ingore添加忽略文件无较的解决方法
			
一.启动Git Bash并切换到项目目录下 二.执行下列语句: git rm -r --cached . git add . git commit -m 'update .gitignore' 三.O ...
 - html转译字符 字符实体
			
http://www.w3school.com.cn/html/html_entities.asp http://www.w3school.com.cn/tags/html_ref_entities. ...