聊聊 #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:的更多相关文章
- iOS-UICollectionView
1--------------------------------------------------------------------------------------------------- ...
- (ios) 屏幕触摸总结
1 屏幕触控实现(单击 双击) [self becomeFirstResponder]; //允许多点互动 self.view.multipleTouchEnabled=TRUE; 实现事件部分 # ...
- iOS UICollectionView的实现
ios的UICollectionView并不能在iOS6之前的版本中使用,为了兼容之前的版本需要自定义UICollectionView.写完之后发现人家已经有开源了,下过来看了看发现我是用UIScro ...
- UITabBarController使用详解
UITabBarController是IOS中很常用的一个viewController,例如系统的闹钟程序,ipod 程序等.UITabBarController通常作为整个程序的rootViewCo ...
- IOS 取值控件(UIPicker)的使用方法
1.简单地取值控件示例 我们要做的一个UITextFiled,当点击UITextFiled,出现一个UIPick取值的页面,可以选择性别,在viewDidLoad中写下 //sexPicker UIP ...
- IOS 表视图(UITableVIew)的使用方法(8)表视图的编辑功能(多选)
在表视图的删除操作中,每次只能够对其中一个单元进行删除,如果想要同时删除多条记录,不得不挨个地进行标准的删除操作 所以如果能够实现多选的机制,无论是删除还是其他功能的嫁接,都会变得更加方便 当UITa ...
- IOS 表视图(UITableVIew)的使用方法(7)表视图的编辑功能(拖拉调整排序位置)
除了每个单元行左边的删除和新增图标,UITableView还支持在单元行的右侧显示一个供用户拖拉调整排序位置的控件. 不过如果要显示此控件,UITableView的数据源需要实现以下的方法. -(vo ...
- IOS 表视图(UITableVIew)的使用方法(5)表视图的编辑功能(删除)
默认的,如果表视图支持编辑,那用户可以通过两种方式来删除某些行,其一为单击左侧的红色按钮后行右侧显示“Delete”按钮,其二为在单元行上的手指向左滑动,“Delete”按钮也会出现供用户单击.无论哪 ...
- IOS 表视图(UITableVIew)的使用方法(3)名单的索引显示
当数据量特别大时,简单地以role进行分段,对实际查找的效率提升并不大.就像上一节开头所说,开发者可以根据球员名字的首字母进行分段,且分成26段.由于段数较多,可以使用UITableView的索引机制 ...
随机推荐
- android:照片涂画功能实现过程及原理
这个功能可以帮你实现,在图片上进行随意的涂抹,可以用于SNS产品. 绘图本身很简单,但是要实现在图片上指定的部分精确(位置,缩放)的绘图,就有点麻烦了. 下面讲讲实现过程及原理: UI构图 这个UI, ...
- bzoj 3997 [TJOI2015]组合数学(DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3997 [题意] 给定一个nm的长方形,每次只能使经过格子权值减1,每次只能向右向下,问 ...
- redis在mac上的安装
mac 上安装 redis 首先必须保证mac 已经安装 xcode. 因为make时要用到 Xcode 的command Tools . (1)下载 redis http://redis.goo ...
- 关于C++ vector的拷贝
定义了vector变量,在使用时直接用了等号赋值,后来发现有问题,就查了一下vector怎么赋值? 说明:vector是一个构造对象,不能直接使用=符号进行复制,必须迭代每个元素来复制.或者重载=操作 ...
- SAE 合并图片
$domain = 'picleader'; //图片库的域名 $stgurl = 'http://lemonluoxing-picleader.stor.sinaapp.com/'; //绝对路径 ...
- Android程序的安全系统【转】
最近在移植Android过程中遇到了Android程序(apk)权限的问题.最近也对这方面进行了一些了解,在此和大家分享. Android框架是基于Linux内核构建,所以Android安全系统也是基 ...
- nginx 502 错误
今天帮朋友处理一个程序报错,重启nginx服务之后,发现首页打不开了,但是静态文件可以打开 经检查nginx 服务器正常运行,重启无数次仍然502错误,考虑到静态文件可以打开,怀疑可能是php 脚本程 ...
- STC-ISP下载过程
- POJ 3660 Cow Contest (Floyd)
http://poj.org/problem?id=3660 题目大意:n头牛两两比赛经过m场比赛后能判断名次的有几头可转 化为路径问题,用Floyd将能够到达的路径标记为1,如果一个点能 够到达剩余 ...
- Altium Desiger自定义BOM导出格式
用Excel做一个xx.xlt的2003的模版文件,如名为:AltiumDesiger PCB BOM Template.xlt 将AltiumDesiger PCB BOM Template.xlt ...