背景

学习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. SQL SERVER 的用户数,连接,连接池 license

    SQL SERVER 理论上有32767个逻辑连接,SQL SERVER根据系统自行调配连接池. 首先 ,操作系统的用户数:即同时通过网络连接到这台电脑上面的用户限制,以5用户操作系统,搭建的文件服务 ...

  2. Laravel 5 中使用 JWT(Json Web Token) 实现基于API的用户认证

    在JavaScript前端技术大行其道的今天,我们通常只需在后台构建API提供给前端调用,并且后端仅仅设计为给前端移动App调用.用户认证是Web应用的重要组成部分,基于API的用户认证有两个最佳解决 ...

  3. 【Spark】开发Spark选择Java还是Scala?

    Spark-Java-Scala-哪种语言 spark java 支持_百度搜索 (1 封私信)Spark 中用 Scala 和 java 开发有什么区别? - 知乎 (1 封私信)Spark平台下, ...

  4. xgboost入门与实战

    xgboost入门与实战(实战调参篇) https://blog.csdn.net/sb19931201/article/details/52577592 前言 前面几篇博文都在学习原理知识,是时候上 ...

  5. UltraISO制作U盘启动盘安装Win7/9/10系统攻略

    U盘安装好处就是不用使用笨拙的光盘,光盘还容易出现问题,无法读取的问题.U盘体积小,携带方便,随时都可以制作系统启动盘. U盘建议选择8G及以上大小的. 下面一步一步讲解如果制作U盘安装盘: 1.首先 ...

  6. Discuz常见小问题-如何取消帖子置顶

    定位到一个帖子,然后顶部会有置顶的选项,还是勾选置顶,后面下拉列表选择无,然后点击确定,提示解除置顶  

  7. C#.NET常见问题(FAQ)-如何使用变量访问控件属性

    不管哪种类型的控件,可以用下面这种强制转换和Controls.Find的方法来读写控件的属性 //我在界面上做了三个picturebox控件 PictureBox p; //注意索引必须从1开始,并且 ...

  8. 3611: [Heoi2014]大project|树形DP|虚树

    构建出虚树然后DP统计答案 自己写的DP太傻QAQ,各种WA 膜了一发PoPoQQQ大爷的DP方法 mxdis,mndis分别表示到当前点近期和最远的被选出来的点的距离 mx,mn分别表示在以当前点为 ...

  9. Spring开发 - 通过实现ApplicationContextAware在Servlet中调用注解的Service

    用过Spring MVC的人都知道,我们如何在Controller中注入Service,可以使用@Resource注解的方法. 有时候,实际在项目的过程中,我们需要在某个Servlet中使用Servi ...

  10. 树莓派中找不到/dev/video0的解决方案及RaspberryCam的使用

    一.原因 当使用CSI连接的方式将摄像头模块连接树莓派后,在/dev/中找不到video0,因此使用一些第三方库(如Opencv或RaspberryCam)去调用摄像头时,无法调用成功. 二.解决方法 ...