聊聊 #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的索引机制 ...
随机推荐
- 机器学习中的数学(3)-模型组合(Model Combining)之Boosting与Gradient Boosting
版权声明: 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系wheeleast@gm ...
- Eclipse与tomcat服务器建立关联
首先,点击 打开preference,打开如下界面 点击ADD,进入如下界面,选择tomcat服务器的版本->点击next 进入如下界面,Name:服务器名字,directory:服务器目录 补 ...
- HDU-4738 Caocao's Bridges 边联通分量
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 题意:在有重边的无向图中,求权值最小的桥. 注意trick就好了,ans为0时输出1,总要有一个 ...
- NotePad++ delphi/Pascal函数过程列表插件
从cnpack上爬下来的 函数过程列表 点击下载
- [转]SQL中char、varchar、nvarchar的区别
char char是定长的,也就是当你输入的字符小于你指定的数目时,char(8),你输入的字符小于8时,它会再后面补空值.当你输入的字符大于指定的数时,它会截取超出的字符. nvarcha ...
- Java邮件服务学习之五:邮箱服务服务端 Apache
Apache James(Java Apache Mail Enterprise Server)是Apache组织的子项目之一,完全采用纯Java技术开发,实现了SMTP.POP3与NNTP等多种邮件 ...
- Android问题-No resource found that matches the given name (at 'theme' with value '@style/CaptureTheme').
问题现象:在看一个实例中写到的,提示如下: [PAClient Error] Error: E2312 C:\Users\zhujq-a\Desktop\Android实例之实现扫描二维码并生成二维码 ...
- mysql查询数据库大小和表
每个mysql都有一个库information_schema,里面有一张表TABLES存储了所有数据库表的信息,因此,可以从这张表中查看数据库大小和表大小 查询数据库大小 ,),'GB') as da ...
- codeforces 630F Selection of Personnel(组合数)
F. Selection of Personnel time limit per test 0.5 seconds memory limit per test 64 megabytes input s ...
- Educational Codeforces Round 13 D. Iterated Linear Function (矩阵快速幂)
题目链接:http://codeforces.com/problemset/problem/678/D 简单的矩阵快速幂模版题 矩阵是这样的: #include <bits/stdc++.h&g ...