聊聊 #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一致,具体用法和效果就看下面吧:

具体内容就到此为止吧,深入的地方就等你们告诉我了哟。感谢大家的阅读,退下吧,朕要洗白白去了。

时间: 2024-10-29 19:12:04

聊聊 #pragma 和 // MARK:的相关文章

UITabBarController使用详解

UITabBarController是IOS中很常用的一个viewController,例如系统的闹钟程序,ipod 程序等.UITabBarController通常作为整个程序的rootViewController,而且不能添加到别的container viewController中. 首先我们看一下它的view层级图: 一.手动创建UITabBarController 最常见的创建UITabBarController的地方就是在application delegate中的 applicati

UITabBarController详解

UITabBarController详解 UITabBarController使用详解 UITabBarController是IOS中很常用的一个viewController,例如系统的闹钟程序,ipod程序等.UITabBarController通常作为整个程序的rootViewController,而且不能添加到别的container viewController中. 首先我们看一下它的view层级图: 一.手动创建UITabBarController 最常见的创建UITabBarContr

swift学习第十六天:懒加载和tableView

懒加载 懒加载的介绍 swift中也有懒加载的方式 (苹果的设计思想:希望所有的对象在使用时才真正加载到内存中) 和OC不同的是swift有专门的关键字来实现懒加载 lazy关键字可以用于定义某一个属性懒加载 懒加载的使用 格式 lazy var 变量: 类型 = { 创建变量代码 }() 懒加载的使用 // 懒加载的本质是,在第一次使用的时候执行闭包,将闭包的返回值赋值给属性 // lazy的作用是只会赋值一次 lazy var array : [String] = { () -> [Stri

使用UIImagePickerController拍照和视频录制

一 UIImagePickerController简介和属性介绍. UIImagePickerController继承于UINavigationController.UIImagePickerController可以用来选择照片,它还可以用来拍照和录制视频.首先看一下这个类常用的属性和方法: 属性 说明 @property(nonatomic)           UIImagePickerControllerSourceType     sourceType 拾取源类型,sourceType是

ZXingObjc 扫描相册二维码

// 点击“相册”按钮 -(void)openAlbum { //打开之前最好判断应用是否拥有打开系统“照片”的权限,同理,扫描之前也最好要判断,此处不赘述 if (!_picker) { _picker = [[RCImagePickerController alloc] init]; _picker.delegate = self; _picker.allowsEditing = NO;   // 设置选中相册的图片后,不需要编辑(截取部分),直接解析图片 _picker.sourceTyp

使用注释提高iOS开发效率

文章目录 新手在开始参与一个开发项目的时候,会把大部分的时间耗费在阅读项目的需求文档.开发文档和代码,一篇好的需求文档和开发文档会帮助新手很快的理解项目的目标和进度,而新手对于代码的阅读会先从代码的注释开始.拥有良好注释的代码可以省去团队其他的开发者好多时间,不至于让其他参与者去一行一行的阅读代码,去不断地加断点查看代码地跳转逻辑,接下来我们就谈谈iOS开发中使用的一些注释. #pragma mark 确切地说,这是Xcode编译器特定得编译命令,它的作用就是在代码地编辑器中,将顶部的方法函数弹

swift pragma mark

众所周知,大家在OC中对代码进行逻辑组织 用的是#pragma mark - ,生成分隔线 用#pragma mark 函数说明,来生成一个函数的说明X 但在swift中,这个语法就不支持了,毕竟它是属于C的语法,于是就有了新的一些语法,如:// MARK: // FIXME // TODO: 等 // MARK: - 生成分隔线 // MARK: 说明 别忘了那个冒号... 参考 :http://stackoverflow.com/questions/24017316/pragma-mark-

善用#waring,#pragma mark 标记

在项目开发中,我们不可能对着需求一口气将代码都写好.开发过程中肯定遇到诸如需求变动,业务逻辑沟通,运行环境的切换等这些问题.当项目大的时候,如果木有形成统一的代码规范,在项目交接和开发人员沟通上将会带来很大的麻烦. #pragma mark - 这个标记在iOS开发中用得最多了.其实最主要的是用来进行标记的,当然也有注释的作用在里面.当然我们也可以用//,/* */等常用注释来说明.但是用#pragma mark -不同的是可以将整个文件的函数以类似分组的形式展现.当我们点击Xcode 导航栏上

1,对象的存储细节,2,#pragma mark指令,3,函数和对象方法的区别,4,对象和方法之间的关系 ,5.课堂习题

1,对象的存储细节, 1. 当创建一个对象的时候:Person *p1 = [Person new],做了三件事情: 1,申请堆内存空间: 2,给实例变量初始化: 3,返回所申请空间的首地址; 2. 实例变量保存在堆区 3. 对象方法保存在代码区 4. 一个类可以创建多个对象: 2,#pragma mark指令, 功能:对代码分组,方便代码查找和导航 使用格式: #pragma mark - #waring 等待处理的功能,或者是未完成的功能 3,函数和对象方法的区别, 一. 对象方法: -(v