背景

学习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. LSTM 文本情感分析/序列分类 Keras

    LSTM 文本情感分析/序列分类 Keras 请参考 http://spaces.ac.cn/archives/3414/   neg.xls是这样的 pos.xls是这样的neg=pd.read_e ...

  2. Eclipse 2017最佳20个插件

    https://www.infoworld.com/article/2606814/development-tools/development-tools-12-eclipse-plug-ins-ev ...

  3. CHtmlEditCtrl(1) : Use CHtmlEditCtrl to Create a Simple HTML Editor

    I needed a lightweight HTML editor to generate "rich text" emails, so I decided to explore ...

  4. Idea卡在Maven导入工程

    Idea卡在Maven导入工程的解决办法 1.看日志 tail -100f cd ~/Library/Logs/IntelliJIdea2017.2/idea.log 你可以换下路径中Idea的版本或 ...

  5. WebRTC学习之九:摄像头的捕捉和显示

    较新的WebRTC源代码中已经没有了与VoiceEngine结构相应的VidoeEngine了,取而代之的是MeidaEngine.MediaEngine包括了MediaEngineInterface ...

  6. Mathematica 文本界面获得之前的结果

    使用%号做标记.获得文本界面之前的运算结果:

  7. android中使用通知功能

    本文实现一个功能:点击一个按钮,发送一个系统通知功能 添加一个Activity activity_main.xml: <?xml version="1.0" encoding ...

  8. uni/微信小程序 - 使用字体图标

    阿里字体图标:http://www.iconfont.cn/home/index?spm=a313x.7781069.1998910419.2 1.单个/ 多个选择字体图标 2. 导入字体库 可以参考 ...

  9. hive中简单介绍分区表(partition table)——动态分区(dynamic partition)、静态分区(static partition)

    一.基本概念 hive中分区表分为:范围分区.列表分区.hash分区.混合分区等. 分区列:分区列不是表中的一个实际的字段,而是一个或者多个伪列.翻译一下是:“在表的数据文件中实际上并不保存分区列的信 ...

  10. JAVA 线程池入门事例

    线程池这个概念已经深入人心了,今天就是通过几个入门事例,学习一下线程池在JAVA中的应用. 一.大小固定的线程池——Executors.newFixedThreadPool() 下面咱们明确两个类: ...