- 什么是 Object-C? (定义和定位)
- 核心语法特性 (与 C 的最大不同)
- 工作原理 (运行时)
- 一个简单的代码示例
- 优缺点和应用场景
- 与 Swift 的关系和未来
什么是 Object-C?
Object-C (通常写作 Objective-C) 是一种通用、高级的、面向对象的编程语言,它是对 C 语言语言的超集,这意味着任何合法的 C 语言代码都可以在 Object-C 中直接编译和运行。

Object-C = C + 面向对象的消息传递机制
- C 语言基础:它拥有 C 语言的所有特性,如指针、结构体、函数、预处理等,这使得 Object-C 具备了 C 语言的高效和底层操作能力。
- 面向对象:它添加了 Smalltalk 风格的面向对象特性,如类、继承、多态等。
- 动态性:这是 Object-C 最核心、最强大的特点之一,它的很多操作(如方法调用、类型检查)都是在运行时决定的,而不是在编译时。
历史与定位: Object-C 最初由 Brad Cox 和 Tom Love 在 1980 年代开发,它曾是 NeXT 公司(后被苹果收购)操作系统的核心语言,它仍然是苹果生态系统(iOS, macOS, watchOS, tvOS)开发的传统语言,尤其是在维护旧的苹果项目时。
核心语法特性
Object-C 的语法非常独特,充满了方括号 [] 和 符号,这让它一眼就能被认出来。
a. 消息传递
这是 Object-C 与 C++/Java 等主流语言最大的区别,在 C++ 中,object.method() 是一个函数调用,而在 Object-C 中,[object method] 是一条消息发送。

- C++/Java 思想:“调用对象
object的method方法。” - Object-C 思想:“向
object这个对象发送一条method消息。”
这个细微的差别带来了巨大的灵活性。object 无法响应 method 消息,程序不会直接崩溃,而是可以进入一个“转发”机制,让其他对象尝试处理它。
b. 语法结构
-
接口与实现分离 Object-C 通常将类的声明(.h 文件,称为 Interface)和实现(.m 文件,称为 Implementation)分开。
-
MyObject.h (接口)
#import <Foundation/Foundation.h> @interface MyObject : NSObject // 继承自 NSObject - (void)myMethod; // 实例方法,以 - 开头 + (void)myClassMethod; // 类方法,以 + 开头 @end
-
MyObject.m (实现)
(图片来源网络,侵删)#import "MyObject.h" @implementation MyObject - (void)myMethod { NSLog(@"myMethod 被调用了!"); } + (void)myClassMethod { NSLog(@"myClassMethod 被调用了!"); } @end
-
-
方法声明
- (减号): 声明一个实例方法,需要先创建对象实例才能调用。
- (加号): 声明一个类方法,可以直接通过类名调用,无需创建实例。
-
关键字和符号
@interface,@implementation,@end: 定义类的开始和结束。@property: 自动生成成员变量的“属性”声明,并自动为其创建 getter 和 setter 方法,这是现代 Object-C 的核心,极大简化了代码。@synthesize: (在较旧版本中需要) 将@property声明与实际的成员变量关联起来,现代 Xcode 默认自动合成。id: 一个万能的指针类型,可以指向任何 Object-C 对象。NSObject: 几乎所有 Object-C 类的根类,它提供了运行时系统所需的基本方法(如内存管理、反射等)。
c. 内存管理
早期的 Object-C 使用引用计数 进行内存管理,开发者需要手动调用 retain, release, autorelease。
- 规则:
alloc/new/copy的对象,你需要负责release,其他方式创建的,你不需要。 - 现代方案:为了解决手动管理的繁琐和易错,苹果引入了 ARC (Automatic Reference Counting),ARC 是一个编译器特性,它会自动在代码中插入
retain,release调用,开发者无需再手动管理,但需要遵循一些所有权规则(如strong,weak,unsafe_unretained)。
工作原理:运行时
Object-C 的强大之处在于它的运行时系统。
- 动态类型:可以在运行时才确定对象的类型。
id myObject = ...;,myObject可以是任何类的实例。 - 动态绑定:在运行时才决定具体调用哪个方法,当你发送
[myObject doSomething]消息时,运行时会查找myObject对象的实际类,然后在该类及其父类的方法列表中寻找doSomething方法并执行它。 - 动态加载:可以在程序运行时动态地加载、链接和卸载可执行模块(如框架)。
这种动态性使得 Object-C 非常灵活,催生了如键值编码和键值观察 等强大的技术。
一个简单的代码示例
下面是一个完整的、可运行的 Object-C 程序,展示了类、对象、消息传递和 NSLog。
// 1. 导入框架
#import <Foundation/Foundation.h>
// 2. 定义一个类 (Person.h 和 Person.m 的概念合在一起)
// @interface: 声明类的公共接口
@interface Person : NSObject // 继承自 NSObject
// @property: 自动生成 name 属性和它的 getter/setter
@property (nonatomic, copy) NSString *name; // nonatomic (非原子性,性能更好), copy (字符串用 copy 防止被意外修改)
// 声明一个方法
- (void)greet;
@end
// @implementation: 实现类的具体代码
@implementation Person
// @synthesize: 在 ARC 下通常省略,编译器会自动生成
// @synthesize name = _name; // 可以将属性关联到一个名为 _name 的成员变量
// 实现之前声明的方法
- (void)greet {
// NSLog: 类似于 C 的 printf,但支持 Objective-C 的格式化字符串
// %@ 是用于打印对象描述的特殊格式
NSLog(@"你好,我是 %@!", self.name);
}
@end
// 3. 程序入口点 main 函数
int main(int argc, const char * argv[]) {
// 创建一个自动释放池,是内存管理的一部分
@autoreleasepool {
// 创建一个 Person 对象
// alloc: 分配内存
// init: 初始化
// [[ alloc ] init] 是最标准的对象创建方式
Person *person1 = [[Person alloc] init];
// 使用点语法设置属性(本质上是调用 setter 方法)
person1.name = @"张三";
// 发送消息,调用对象的 greet 方法
[person1 greet];
// 创建第二个对象
Person *person2 = [[Person alloc] init];
person2.name = @"李四";
[person2 greet];
}
return 0;
}
输出结果:
2025-10-27 10:30:00.123 myApp[12345:67890] 你好,我是 张三!
2025-10-27 10:30:00.124 myApp[12345:67890] 你好,我是 李四!
优缺点和应用场景
优点:
- 动态性:运行时特性提供了无与伦比的灵活性,便于实现插件化、AOP(面向切面编程)等高级设计。
- 兼容 C:可以直接使用庞大的 C 语言库,进行底层操作。
- 成熟的工具链:拥有 Xcode、Clang、Instruments 等非常成熟和强大的开发工具。
- 生态系统:是苹果原生开发的基石,拥有最完整的 API 和框架支持。
缺点:
- 语法繁琐:相比于现代语言(如 Swift, Python),其语法显得冗长和复杂。
- 性能开销:消息传递比直接函数调用有额外的性能开销(尽管现代编译器做了大量优化)。
- 学习曲线:对于没有 C 语言或 Smalltalk 经验的开发者来说,其概念和语法可能比较难上手。
- 现代性不足:缺乏现代编程语言的一些特性,如闭包、泛型(虽然有
id,但类型安全性差)、更简洁的控制流等。
应用场景:
- 维护遗留项目:大量的苹果旧项目是用 Object-C 写的,维护和更新它们需要这门语言。
- 需要极致动态性的系统:某些需要高度插件化或运行时修改行为的底层框架。
- 与 C 代码库深度集成:项目需要直接操作硬件或与现有 C 库紧密耦合。
- 学习苹果平台开发:理解 Object-C 有助于理解苹果底层框架的设计思想。
与 Swift 的关系和未来
苹果在 2025 年推出了 Swift 语言,作为 Object-C 的继任者。
- Swift 的优势:更现代、更安全(类型系统强大)、更易读、性能更好(编译成高效的机器码)。
- 现状:苹果官方明确表示,Swift 是未来,所有新的 API 和框架都以 Swift 为首选,开发者被强烈推荐在新项目中使用 Swift。
- 共存:Object-C 并没有消失,Swift 可以无缝地调用 Object-C 代码,反之亦然,这使得在漫长的迁移过程中,旧代码和新代码可以共存,苹果也一直在为 Object-C 带来 Swift 的一些现代特性(如泛型、模块化)。
对于新开发者,应该直接学习 Swift,但对于任何希望深入苹果平台开发、特别是需要维护历史项目的人来说,Object-C 仍然是一门必须掌握的重要语言,它不仅是历史,更是理解苹果生态底层逻辑的一把钥匙。
