内联函数

“内联函数”是一个很老的概念,在其他语言譬如C++语言中也出现了。所谓“内联函数”指的是“有函数的结构,但不具备函数的性质,类似于宏替换功能的代码块”。

在实际应用中,常常把规模较小、逻辑较简单的操作定义成内联函数,定义内联函数只要在函数前面加上inline关键字修饰即可;站在编译器的角度,处理内联函数就是在每个它的调用点上“内联地”展开。假设有定义如下函数:

inline NSString * getNavigationTitleWithCount(int cnt) {
return [NSString stringWithFormat:@"已选中%d项", (int)cnt];
}

则编译器对如下代码

UILabel *label = [UILabel new];
label.text = getNavigationTitleWithCount();

的处理,如同对如下代码代码的处理:

UILabel *label = [UILabel new];
label.text = [NSString stringWithFormat:@"已选中%d项", (int)];

一句话说明,程序在“调用”内联函数时的开销和“调用”宏的开销是一样的,但内联函数显然比宏要强大一些,至少它保证了类型安全;相较于普通函数,“调用”内联函数没有“保护现场、push栈、pop栈等等”之类的开销。

内联函数的好处显而易见,但并不是所有函数都可以形成真正的内联函数。如上所述,定义一个内联函数只要在定义时加上inline关键字即可,但能否形成真正的内联函数,还要看编译器对内联函数体内部的定义的具体处理。

一般来说,内联函数定义的代码量逻辑简单、代码量小,并且属于那种频繁使用的代码块;内联函数不能使用循环语句,不能使用递归调用;

const的使用

在Objective-C代码中,经常需要定义一些常量指针,譬如AFNetworking中有如下代码:

extern NSString * const AFNetworkingReachabilityDidChangeNotification;
extern NSString * const AFNetworkingReachabilityNotificationStatusItem;

和其他语言一样,定义常量的关键字是const,但问题是常常不知道const该往哪里放,是这样NSString * const XXOO,还是NSString const * XXOO

其实,在Objective-C中还好一点,C/C++中const的各种使用姿势更难懂,如下:

const char * label1 = "";
char const * label2 = "";
char * const label3 = "";
const char * const label4 = "";

经常傻傻分不清楚。不过还好,我的记忆还算可以,记得本科C语言老师教过一种简单的记忆方法“const总是修饰其左边的东东,如果其左边没有东东,则修饰右边的东东”,如何理解?对于char const * label2而言,const的左边是char,所以const修饰的是char本身,即内容本身,所以表示“label1指向的内容是常量,不可变”;对于const char * label1而言,const左边没有东东,所以它修饰右边的东东,即char,所以表示“label2指向的内容是常量,不可变”;对于char * const label3,const左边的东东是*,所以修饰的是指针,即表示“label3指针本身是常量,不可变”,所以解释如下:

const char * label1 = ""; // 内容是常量,不可变
char const * label2 = ""; // 内容是常量,不可变
char * const label3 = ""; // 指针是常量,不可变
const char * const label4 = ""; // 指针和内容都是常量,不可变

这个判断方法同样适用于Objective-C,所以如下代码是没问题的:

// const的左边是NSString,修饰的是NSString对象,表示“NSString对象本身不可修改”(但指针可以)
static NSString const * testString = @"I am an iOS developer"; - (void)viewDidLoad {
[super viewDidLoad];
testString = @"我是一个iOS开发者"; // 合法
NSLog(@"%@", testString); // print "我是一个iOS开发者"
}

但如下代码不合法:

// const的左边是*,修饰的是指针本身,表示testString地址值不可修改
static NSString * const testString = @"I am an iOS developer"; - (void)viewDidLoad {
[super viewDidLoad];
testString = @"我是一个iOS开发者"; // 非法
NSLog(@"%@", testString);
}

.mm文件

  • .m文件是Objective-C文件
  • .mm文件相当于C++或者C文件

Extension和Category

参考:http://blog.csdn.net/leikezhu1981/article/details/19091049

Compiler Directives

http://nshipster.com/at-compiler-directives/

http://blog.sunnyxx.com/2014/04/13/objc_dig_interface/

#pragma

nil/Nil/NULL/NSNull

http://nshipster.com/nil/

isEqual:和==

http://nshipster.com/equality/

Objective-C基础知识的更多相关文章

  1. 转载 Deep learning:一(基础知识_1)

    前言: 最近打算稍微系统的学习下deep learing的一些理论知识,打算采用Andrew Ng的网页教程UFLDL Tutorial,据说这个教程写得浅显易懂,也不太长.不过在这这之前还是复习下m ...

  2. Deep learning:一(基础知识_1)

    本文纯转载: 主要是想系统的跟tornadomeet的顺序走一遍deeplearning; 前言: 最近打算稍微系统的学习下deep learing的一些理论知识,打算采用Andrew Ng的网页教程 ...

  3. Deep Reinforcement Learning 基础知识

    Introduction 深度增强学习Deep Reinforcement Learning是将深度学习与增强学习结合起来从而实现从Perception感知到Action动作的端对端学习的一种全新的算 ...

  4. Deep Reinforcement Learning 基础知识(DQN方面)

    Introduction 深度增强学习Deep Reinforcement Learning是将深度学习与增强学习结合起来从而实现从Perception感知到Action动作的端对端学习的一种全新的算 ...

  5. DL一(ML基础知识)

    基础知识ML 在进行深度学习前,根据学习网站的建议,首先学习机器学习的基础课程,学习资料主要是Andrew讲的ShortVideo,网址:http://openclassroom.stanford.e ...

  6. Objective-c基础知识学习笔记

    Objective-c基础知识学习笔记(一) 一直有记录笔记的习惯.但非常久没分享一些东西了,正好上半年開始学习IOS了,如今有空写点.因开发须要,公司特意为我们配置了几台新MAC.还让我们自学了2周 ...

  7. .NET面试题系列[1] - .NET框架基础知识(1)

    很明显,CLS是CTS的一个子集,而且是最小的子集. - 张子阳 .NET框架基础知识(1) 参考资料: http://www.tracefact.net/CLR-and-Framework/DotN ...

  8. RabbitMQ基础知识

    RabbitMQ基础知识 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然 ...

  9. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

  10. selenium自动化基础知识

    什么是自动化测试? 自动化测试分为:功能自动化和性能自动化 功能自动化即使用计算机通过编码的方式来替代手工测试,完成一些重复性比较高的测试,解放测试人员的测试压力.同时,如果系统有不份模块更改后,只要 ...

随机推荐

  1. call 和 apply 方法区别

    在js中call和apply它们的作用都是将函数绑定到另外一个对象上去运行,两者仅在定义参数方式有所区别,下面我来给大家介绍一下call和apply用法. 在web前端开发过程中,我们经常需要改变th ...

  2. 【java】java base64编码与解码

    参考地址:http://blog.csdn.net/zhou_kapenter/article/details/62890262 要求:JDK1.8+ 使用java原生工具类即可实现 [这里展示字符串 ...

  3. Oracle 12c agent install for linux

    安装Agent代理 在EM11g时,agent安装是通过在被监制主机端下载agent代理并安装,在EM12c版本号上,能够在EM12c服务端.通过"推送"的方式把agent代理在远 ...

  4. Linux上利用NFS实现远程挂载

    两台服务器 192.168.1.1 [WEB服务器] 192.168.1.2 [录音服务器] 说明 在192.168.1.2服务器上每天有许多录音文件生成,192.168.1.1作为WEB服务器,里面 ...

  5. 【转】LINUX 手动建立SWAP文件及删除

    如何在红帽 企业版Linux系统中添加swap文件? 解决方法: 1. 确定swap文件的大小,单位为M.将该值乘以1024得到块大小.例如,64MB的swap文件的块大小是65536. 2. 在ro ...

  6. EBS OAF开发中怎样实现功能页签(Global Tab)

    EBS OAF开发中怎样实现功能页签(Global Tab) (版权声明.本人原创或者翻译的文章如需转载.如转载用于个人学习,请注明出处.否则请与本人联系,违者必究) 功能页签的实现不须要不论什么编码 ...

  7. TCP 的那些事儿(下)(转)

    TCP的RTT算法 从前面的TCP的重传机制我们知道Timeout的设置对于重传非常重要, 设长了,重发就慢,没有效率,性能差: 设短了,重发的就快,会增加网络拥塞,导致更多的超时,更多的超时导致更多 ...

  8. java utf8字符 导出csv 文件的乱码问题。

    在输出的格式为UTF-8的格式,但是打开CSV文件一直为乱码,后来参考了这里的代码,搞定了乱码问题,原文请参考:http://hbase.iteye.com/blog/1172200 private ...

  9. Android NDK JNI WARNING: illegal start byte 0x

    今天攻克了JNI WARNING: illegal start byte 0x81这个问题. 问题出现的现象是通过jni调用加密方法,调用之后返回密文内容,结果就出现这个问题. 在国外查找一段时间之后 ...

  10. Pycharm下运行程序查看每个变量的值的方法(类似于Spyder和MATLAB)

    昨天,用了大量篇幅讲了Spyder的各种问题,之所以要用Spyder,最重要的一个原因就是能够非常方便的查看中间变量的值.类似MATLAB的工作空间,非常方便.如下图所示: 但是Spyder的代码自动 ...