背景

学习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 用命令 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(一)的更多相关文章

  1. iOS 开发中一些 tips

    tableView 的 tableHeaderView 高度不正确的问题: func forceRefreshHeader() { let size = headerView.systemLayout ...

  2. ios开发中的小技巧

    在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新. UITableView的Group样式下顶部空白处理 //分组列表头部空白处理 UIView *view = [[UIViewal ...

  3. fir.im Weekly - iOS开发中的Git流程

    本期 fir.im Weekly 收集了微博上的热转资源,包含 Android.iOS 开发工具.源码等好用的轮子,还有一些 APP 设计的 Tips,希望对你有用. 精仿知乎日报 iOS 端 @我偏 ...

  4. 总结iOS开发中的断点续传那些事儿

    前言 断点续传概述 断点续传就是从文件赏赐中断的地方重新开始下载或者上传数据,而不是从头文件开始.当下载大文件的时候,如果没有实现断点续传功能,那么每次出现异常或者用户主动的暂停,都会从头下载,这样很 ...

  5. iOS开发中静态库之".framework静态库"的制作及使用篇

    iOS开发中静态库之".framework静态库"的制作及使用篇 .framework静态库支持OC和swift .a静态库如何制作可参照上一篇: iOS开发中静态库之" ...

  6. iOS开发中静态库制作 之.a静态库制作及使用篇

    iOS开发中静态库之".a静态库"的制作及使用篇 一.库的简介 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的类型? 根据源代码的公开情况,库可以分为2种类 ...

  7. IOS 开发中 Whose view is not in the window hierarchy 错误的解决办法

    在 IOS 开发当中经常碰到 whose view is not in the window hierarchy 的错误,该错误简单的说,是由于 "ViewController" ...

  8. [转]iOS开发中的火星坐标系及各种坐标系转换算法

     iOS开发中的火星坐标系及各种坐标系转换算法 源:https://my.oschina.net/u/2607703/blog/619183   其原理是这样的:保密局开发了一个系统,能将实际的坐标转 ...

  9. iOS开发中常见问题集锦

    在iOS开发中,会出现各种各样的问题.今天,就把这些常见的问题以及各位大牛的解决方案汇总下,方便以后查阅: 常见错误: 1. linker command failed with exit code ...

随机推荐

  1. js获取当前域名、Url、相对路径和参数

    用 Javascript 可以单独获取当前域名.Url.相对路径和参数,所谓单独攻取,即域名不包括网页文件的路径和参数.参数不包括域名和网页文件路径,下面分别介绍. 一.js获取当前域名有2种方法 1 ...

  2. Java方法containsAll学习

    有时候我们需要判断B链表是不是A链表的子集,我们可以使用A.containsAll(B)来判断,当返回值是true的时候就表明B链表是A链表的子集,当返回值是false时候就表明B链表不是A链表的子集 ...

  3. 【Scala】Scala-Option-Null的蹊跷

    Scala-Option-Null的蹊跷 scala Some(null)_百度搜索 scala - Why Some(null) isn't considered None? - Stack Ove ...

  4. 解决CentOS下无法发送邮件的问题

    最近有个项目从虚拟主机迁到云主机上,换了个环境,原来用于找回密码的发送邮件功能竟然用不了了!反应极慢,导致tenginx报504网关超时错误. 5.5 or 7.0, sockets 初次百度,看了别 ...

  5. linux免密码登录

    ssh-copy-id 命令 可以把本地主机的公钥复制到远程主机的authorized_keys文件上,ssh-copy-id命令也会给远程主机的用户主目录(home)和~/.ssh, 和~/.ssh ...

  6. android自己定义进度值可拖动的seekbar

    近期忙找实习,加上实验室在推新项目,须要学习新知识.所以非常长一段时间没去整理了官博客了,github也蛮久没更新.非常羞愧.接下来还是要坚持写. 今天就简单的写一下我在项目中用到的算自己定义seek ...

  7. Skyline开发1-环境搭建

    三维一直很火热,它比二维的明显优势是立体效果,更接近真实的物理世界:凡是与三统有关的就叫XX模型,其实就是一种数据罢了:简单的浏览.展示 操作就看起来很炫,尤其是对外行的人来说.无论如何,领导.用户喜 ...

  8. Centos7中安装Python3

    环境:CentOS 7 1. 安装依赖环境 # yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-dev ...

  9. 如何处理Android中的防缓冲区溢出技术

    [51CTO专稿]本文将具体介绍Android中的防缓冲区溢出技术的来龙去脉. 1.什么是ASLR? ASLR(Address space layout randomization)是一种针对缓冲区溢 ...

  10. 图解VC++ opengl环境配置和几个入门样例

    VC6下载 http://blog.csdn.net/bcbobo21cn/article/details/44200205 demoproject和glut库下载 http://pan.baidu. ...