核心特点概览
Objective-C 的核心可以概括为:C 语言的超集 + 面向对象的消息传递机制 + 运行时系统,它将 C 语言的底层控制能力与 Smalltalk 的动态、面向对象特性巧妙地结合在了一起。

C 语言的超集
这是 Objective-C 最基础也是最重要的特点。
- 兼容 C 语言:任何合法的 C 语言代码都可以直接作为 Objective-C 代码编译和运行,这意味着你可以无缝地使用 C 语言的标准库(如
stdio.h,stdlib.h)、第三方 C 库以及系统 API。 - 底层操作能力:你可以直接进行指针操作、内存管理(通过
malloc/free)、位运算等,这在需要高性能或与硬件/系统底层交互的场景中非常有用。 - 从 C 到 Objective-C 的平滑过渡:对于有 C 语言背景的开发者来说,学习 Objective-C 的门槛相对较低,可以先继续使用 C,然后逐步引入 Objective-C 的面向对象特性。
示例:
// 这是一个完全合法的 Objective-C 文件
#include <stdio.h>
// C 语言代码
void sayHelloInC() {
printf("Hello from C!\n");
}
// Objective-C 代码
#import <Foundation/Foundation.h>
@interface MyObject : NSObject
- (void)sayHelloInObjectiveC;
@end
@implementation MyObject
- (void)sayHelloInObjectiveC {
NSLog(@"Hello from Objective-C!");
}
@end
int main(int argc, const char * argv[]) {
// 调用 C 函数
sayHelloInC();
// 调用 Objective-C 方法
MyObject *obj = [[MyObject alloc] init];
[obj sayHelloInObjectiveC];
return 0;
}
消息传递机制
这是 Objective-C 与 C++、Java 等主流语言最显著的区别。
- 方法调用 vs. 消息发送:
- 在 C++/Java 中,
object.method()是一个方法调用,编译器在编译时就会确定要执行哪个函数,这个过程是静态的、确定的。 - 在 Objective-C 中,
[object method]是一条消息发送,你向一个对象(object)发送一条名为method的消息,对象接收到消息后,由其运行时系统来决定如何响应——即查找并执行对应的方法,这个过程是动态的。
- 在 C++/Java 中,
- 动态性与灵活性:
- 方法解析:如果对象没有实现该方法,运行时会询问其父类,或者通过“消息转发”机制将消息转发给其他对象处理,甚至可以在运行时动态地添加方法实现。
performSelector::这是动态性的一个典型体现,允许你根据字符串来决定调用哪个方法,这在需要高度动态化的代码中非常有用(实现 KVO 的回调)。
- 性能:由于消息传递需要在运行时查找方法表,理论上比 C++ 的静态虚函数调用稍慢,但现代的运行时系统(如 Apple 的)对此进行了大量优化,性能差距已经非常小,在大多数场景下可以忽略不计。
强大的运行时系统
Objective-C 的许多高级特性都依赖于其运行时系统。

- 动态类型:可以使用
id类型来指向任何 Objective-C 对象,在运行时才确定其具体类型,这提供了极大的灵活性。id myObject = [[NSString alloc] initWithString:@"Hello"]; // myObject 可以是任何对象类型
- 动态绑定:方法的实现是在运行时根据对象的实际类型绑定的,而不是在编译时。
- 动态加载:允许在程序运行时动态地加载和链接新的类或框架。
- 反射能力:可以遍历一个对象的所有成员变量和方法,甚至可以修改它们,这是许多框架(如 Key-Value Coding, KVC)的基础。
基于协议 的设计
协议类似于 Java 中的接口或 C++ 中的纯虚类,但它更灵活。
- 定义一组方法:协议声明了一组方法,但不提供实现。
- 非侵入式:一个类可以声明它遵循某个协议,而不需要继承自某个特定的基类,这实现了“面向接口编程”,大大提高了代码的解耦性和可复用性。
- 可选方法:协议中的方法可以被标记为
@optional,遵循协议的类可以选择性地实现这些方法,这在委托模式中非常常见。
Foundation 框架与核心数据类型
Apple 提供了强大的 Foundation 框架,定义了 Objective-C 的核心数据类型和工具类。
NSString:不可变的字符串对象,比 C 语言中的char*安全且功能强大。NSArray/NSDictionary/NSSet:集合类,用于存储对象,提供了丰富且安全的方法来操作数据。NSNumber:将基本数据类型(如int,float,BOOL)包装成对象,以便在集合类中使用。NSObject:几乎所有自定义类的根类,它提供了运行时系统所需的基本方法,如isa指针(用于标识对象所属的类)、respondsToSelector:等。
内存管理
Objective-C 的内存管理机制是其发展史上的一个重要演变过程。
- 早期:手动引用计数
- 开发者需要显式地调用
alloc/new/copy创建对象,并使用retain、release、autorelease来管理其生命周期。 - 规则简单但繁琐,极易造成内存泄漏或野指针。
- 开发者需要显式地调用
- 现代:自动引用计数
- LLVM 编译器 和 运行时系统 合作,在编译时自动在代码中插入
retain、release和autorelease调用。 - 开发者只需遵循简单的规则:谁创建,谁
alloc;谁想保留对象,就retain;谁不再需要,就设为nil。 @property和@synthesize关键字极大地简化了成员变量的内存管理声明(如strong,weak,assign,copy)。- ARC 是目前开发 iOS 和 macOS 应用的标准方式,它兼具了手动管理的灵活性和自动管理的安全性。
- LLVM 编译器 和 运行时系统 合作,在编译时自动在代码中插入
委托模式 与目标-动作机制
这是 Cocoa (Apple 的 API 框架) 设计模式的核心。

- 委托:当一个对象需要完成某项任务但不想自己处理所有细节时,它会将一部分工作“委托”给另一个对象,委托对象需要遵循特定的协议,并实现协议中的方法。
UITableView的数据源和委托。 - 目标-动作:一种用于响应用户界面上事件(如按钮点击)的模式,控件(如按钮)持有一个“目标”对象和一个“动作”方法的选择器,当事件发生时,控件向目标对象发送该动作消息。
优点与缺点
优点
- 成熟稳定:在 Apple 平台上拥有超过 20 年的历史,生态系统非常成熟。
- 灵活与动态:消息传递和运行时系统提供了无与伦比的动态性和灵活性,适合用于构建高度可扩展和可定制的框架。
- 底层控制:作为 C 的超集,可以轻松地与 C 代码和底层系统交互,进行性能优化。
- 强大的框架支持:拥有 UIKit, AppKit, Foundation 等经过千锤百炼的强大框架。
- ARC 简化内存管理:现代的 ARC 机制让内存管理变得简单而安全。
缺点
- 语法冗长:相比于 Swift,其语法(方括号、冒号、点号等)显得较为繁琐和冗长。
- 编译速度慢:由于需要处理大量的运行时代码和动态特性,Objective-C 的编译速度通常比 Swift 慢。
- 现代性不足:缺少现代编程语言的一些特性,如闭包、泛型、类型推断、更强大的元组支持等(尽管可以通过 Category 和第三方库弥补部分)。
- 社区与趋势:Apple 已将 Swift 作为其未来发展的主要语言,新的 API 和功能优先在 Swift 中提供,Objective-C 的社区活跃度和学习资源相对减少。
Objective-C 是一门为 Apple 生态而生的、充满历史智慧的“元老级”语言,它的技术核心——消息传递和运行时系统,使其在动态性和灵活性上独树一帜,尽管 Swift 已成为主流,但 Objective-C 依然是维护和开发遗留项目、与 C 代码库交互、以及利用某些底层运行时特性的重要工具,理解其
