聊聊 #pragma 和 // MARK:
我去,就这两个东西还要讲?是OC或Swift开发人员都知道是怎么回事好吗?不就是用来标记和分组代码的吗?难道还有别的装逼技能?
当然,其实问大部分人说这两个是什么作用,或者是除了这两个还知道什么的情况下。很多人都只知道这两个是用来组织代码的。然而这样说也对也不对,确实我们常用的情况是都是用这两个来组织代码的,但是如果看过很多开源的人肯定看过一下的形式的代码:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-retain-cycles"
.... //一些代码
#pragma clang diagnostic pop
那么这些代码是拿来干嘛的呢?且听我慢慢道来。
确实在我们日常工作中,经常用到#pragma mark或者// MARK:来组织代码,并且大家都知道组织代码有两种形式: 一种是用来分组,一种是用来标注。具体如何展示大家也当我废话,看下下面的代码吧:
// Objective-C 代码
- (void)viewDidLoad {
[super viewDidLoad];
[self initAll];
}
#pragma mark Custom functions
- (void)initAll {
...
}
#pragma mark - UITableViewDataSources
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 10;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
return [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CELL"];
}
#pragma mark - UITableViewDelegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"点击了%li行", indexPath.row);
}
下面是Swift代码:
// Swift 代码
override func viewDidLoad() {
super.viewDidLoad()
initAll()
}
// MARK: Custom function
private func initAll() {
...
}
// MARK: - UITableViewDataSource
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 10
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
return UITableViewCell(style: .Default, reuseIdentifier: "CELL")
}
// MARK: - UITableViewDelegate
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
print("点击了\(indexPath.row)行")
}
那么效果呢,大家也都知道,就是下图这样:
其实主要就是两点,一个就是后面没有跟’-‘的情况,这种情况就不会出现分组,只是当单纯的有注释,另一种就是带’-‘的情况,那么这种情况就会添加一条水平分割线,也就是出现了分组。那么在我们写代码的过程中最好将代码相关性比较强的都分到同一个组别当中去。这样针对以后维护的人员对代码的也能跟快读懂代码。这也就是我们常说的要做注释,增加代码的可读性。
关于这个的用法就不多说了,大家去试试,并且大部分都知道这个特性。那么我们围绕着这个说说其他的特性吧,首先我们先来说说一个可以装逼的神器,就是用它来局部的控制某个警告的开启与关闭,也就是我们文章开头说的那个:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
// 一段代码
#pragma clang diagnostic pop
估计很多小伙伴经常在很多开源代码里面可以看到这段代码,这个代码呢,其实就用来关闭警告的,这样在你有些写一些代码的时候需要忽略某些警告的时候特别有用。具体用法我们就用上面这个来试试吧。
#pragma mark - UITableViewDataSources
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
int unusedInt;
#pragma clang diagnostic pop
return 10;
}
通过下面这段代码忽略没有使用unsedInt这个属性的警告了。那么问题来了,就有人问了:“我怎么知道后面那个”-Wunsed-variable”这个字符串应该是什么呢”?想知道吗?你猜啊,就不告诉你就不告诉你,就不告诉你!(pia~一脱鞋过来,这是三天不打上房揭瓦!)
好吧,其实有两种手段,一种就是网上有人整理了一个网站Which Clang Warning Is Generating This Message?,里面包含了许多警告抑制的字符串,大家可以参考一下。另外一个方案呢,就是通过Xcode来查找,具体步骤如下图:
http://fuckingclangwarnings.com/
先选择Report Navigator,然后选择最后一个日志,选择所有信息,然后去日志中查看你需要的警告信息,并且在哪里警告它都会罗列出来。通过这种手段,我们就可以装逼添加#pragma clang diagnostic ignored的信息了。
当然对于上面这种特殊的为使用的警告,还可以用下面这种形式来关闭警告:
// Objective-C 代码
NSString *unsedString;
#pragma unused(unsedString)
好了,学了这一招就可以在自己代码里面装逼了,那么我们在说说OC中还有哪些好用的功能呢?竟然说到警告,那么我们可以在说如何自己手动的产生警告吧,有两种方式,具体可以看下面的代码:
#pragma message "This is a warning"
#warning "This is another warning"
具体效果如何呢?看看下面这张图:
是不是觉得很神奇,其实在我们日常工作中可以通过这种代码为暂时还没有打算好填写内容的地方打上一个warnings,然后这样我们在我们写代码的过程中就可以注意到这些warning,这样之后我们就可以来填坑了。毕竟我是一个有代码洁癖的人,对于自己代码中有很多警告是完全不能够忍受的,希望大家也能养成这个习惯。 其实除了警告以外,还有一个#error可以用,大家可以尝试一下。
下面我们来说说在Swift中除了MARK以外我们还可以用什么呢:其实还有两个我们可以用的,在大家写Swift过程中可以用到// TODO:与// FIXME:相当于OC中只有警告来指定,我更喜欢Swift中的这种用法,因为它的目的性更明确,其用法与MARK一致,具体用法和效果就看下面吧:
具体内容就到此为止吧,深入的地方就等你们告诉我了哟。感谢大家的阅读,退下吧,朕要洗白白去了。
聊聊 #pragma 和 // MARK:相关推荐
- swift开发记录 - MARK,TODO,FIXME
2019独角兽企业重金招聘Python工程师标准>>> swift中用了3个关键字来取代了objective-c中的#pragma功能 MARK : //MARK: viewDidL ...
- iOS UICollectionView的实现
ios的UICollectionView并不能在iOS6之前的版本中使用,为了兼容之前的版本需要自定义UICollectionView.写完之后发现人家已经有开源了,下过来看了看发现我是用UIScro ...
- iOS-UICollectionView
1--------------------------------------------------------------------------------------------------- ...
- UITabBarController详解
UITabBarController使用详解 UITabBarController是IOS中很常用的一个viewController,例如系统的闹钟程序,ipod程序等.UITabBarControl ...
- iOS 正则表达式判断UITextField是否为全汉字,全字母,全数字,数字和字母
2019独角兽企业重金招聘Python工程师标准>>> 判断全汉字(这个问题苦恼了我很久,现在很方便,几行代码就搞定): if ([self deptNameInputShouldC ...
- Objective-c方法调用流程
Objective-c方法调用流程 Objective-c是一门动态语言,动态两个字主要就体现在我们调用方法的时候,运行时回动态的查找方法,然后调用相应的函数地址.运行时是整个Objective-c程 ...
- IOS开发-TableView表视图LV2
在上一章节IOS开发-TableView表视图基础的学习后, 我觉得对于表视图的学习不应只局限于基础知识的学习,应用在实战中的话想要构建丰富的多元化视图界面我想还是必须深入地再学习下. 于是有了这个L ...
- ios开发——使用CALayer和Core Animation做动画效果
一. CALayer (一). CALayer简介 在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView,其实UIV ...
- Github每日精选(第23期):macOS下的开源清理工具lemon-cleaner
lemon-cleaner柠檬清理 lemon-cleaner 柠檬清理,开源没几天就获得了3k个点赞,大家对macos 下的清理工具兴趣还是很大的. github下的地址在这里. 腾讯柠檬清理是针对 ...
最新文章
- 溢出漏洞利用小结(基础)
- 【arduino】童芯派彩屏显示图片,图片取模后在TFT液晶显示
- Java中用ClassLoader载入各种资源(类、文件、web资源)的方法
- multisim 12.0安装教程
- 9.LDA(线性判别分析)
- oracle提供的有用函数(待续)
- Day3-php 字符串1
- Airflow 中文文档:安全
- 深入java虚拟机需要读吗_《深入理解Java虚拟机》读后总结(一)JVM内存模型
- Java Swing Mysql学生信息管理系统
- 如何避免在Block里用self造成循环引用
- paa 计算机语言,Paa Robertingeri
- denied git permission_Git使用之Permission Denied问题解决[2153-Noblog]
- android入门级智能手表产地,从全球智能手表市场来看,Android智能手表只在中国卖得好...
- common,Google Guava,Guice
- Confluence 6 重新获得附件指南
- Java基础,使用双循环嵌套,实现输出1-1000之间所有的素数,并统计有多少个
- c语言函数库入门,C语言库函数
- java网上购物商城文献综述,JSP电子商务网上购物系统的设计(源代码+论文+开题报告+外文翻译+文献综述)...
- PCL点云数据处理-滤波基础(C++)
热门文章
- 解决老版本eclipse无法完全替换主题的问题
- BZOJ3998: [TJOI2015]弦论(后缀自动机,Parent树)
- 深入理解空间搜索算法 ——数百万数据中的瞬时搜索
- 微信公众号开发之准备工作
- DFS、栈、双向队列:CF264A- Escape from Stones
- python3字符编码错误
- [转]国内各大互联网公司相关技术站点2.0版 (集合腾讯、阿里、百度、搜狐、新浪、360等共49个)...
- [转载]Eclipse.ini的相关说明
- Android Studio no debuggable applications解决方案2
- NHibernate学习系列一