Objective-C 是一种通用、高级、面向对象的编程语言。它扩展了标准的 ANSI C 编程语言,将 Smalltalk 式的消息传递机制加入到 ANSI C 中。目前主要支持的编译器有 GCC 和 Clang。
1981年 Brad Cox 和 Tom Love 还在 ITT 公司技术中心任职时,接触到了 SmallTalk语言。Cox 当时对软件设计和开发问题非常感兴趣,他很快地意识到 SmallTalk 语言在系统工程构建中具有无法估量的价值。
正是由于以上优势,在 Swift 推出之后,许多和 C 有直接交互的部分大多仍旧使用 Objective-C 编写。
Objective-C 与其说调用对象的方法,不如说向对象传递消息更为精确。
Objective-C 因为运行期才处理消息,允许发送未知消息给对象。同时空对象 nil 接受消息后默认为不做事,所以送消息给 nil 也不用担心程序崩溃。
Objective-C 字符串由双引号包裹,并在引号前加一个@符号,如:
在C语言中,使用 #include 导入入头文件。在Objective-C中,类似的指令 #import 保证一个文件只会被包含一次,类似于一般头文件中的:
类的定义文件遵循 C 语言惯例以 .h 为后缀,实现文件以 .m 为后缀。
定义部分,定义类的名称、数据成员和方法。 以关键字 @interface 开始,@end 结束:
方法前面的 +/- 代表函数的类型:加号(+)代表类方法(class method),不需要实例就可以调用,与 Java 的静态方法相似。减号(-)即是一般的实例方法(instance method)。
Objective-C 创建对象需通过 alloc 和 init 两个消息。alloc 是分配内存,init 则是初始化对象。 init 与 alloc 都是定义在 NSObject 里的方法,父对象收到这两个信息并做出正确回应后,新对象才创建完毕。
协议中定义的方法分为必须实现的方法和可选实现的方法。协议中的方法默认必须实现,可选实现的方法以 @optional 为标识。
分类可以给一个已经存在的类增加方法,而不用去改它的源码。类似于 Swift 和 Kotlin 中的扩展(extension)。
比如,NSString 是 Objective-C 内置的系统类,我们创建一个它的分类以支持加法运算:
如果想使某个对象继续存活,那就递增其引用计数(reatain);用完了之后,就递减其计数(release)。当计数为0时,系统就会将它销毁。
简单地说,ARC 在编译时为代码在合适的位置加上 retain 和 release。
属性(property)是 Objective-C 的一项特性,用于封装对象中的数据。实例变量一般通过“存取方法”(access method)来访问。其中,“获取方法”(getter)用于读取变量值,而“设置方法”(setter)用于写入变量值。
点语法的本质还是方法调用,是一种编译器行为,编译器会自动进行转换,来判断调用 set 方法还是 get 方法。