Objective-C(通常简写为 Obj-C 或 OC)是一套通用的、面向对象的编程语言,它是在 C 语言的基础上,增加了 Smalltalk 式的“消息传递”机制,成为苹果 macOS 和 iOS 操作系统及其相关 API 的主要开发语言。

尽管现在 Swift 语言已成为苹果生态系统的首选新语言,但 Objective-C 仍然拥有庞大的存量代码库、成熟的框架和在某些特定场景下的不可替代性,对于任何希望深入苹果生态的开发者来说,理解 Objective-C 都至关重要。
核心特点
a. C 语言的超集
Objective-C 完全兼容 C 语言,这意味着你可以在 Objective-C 代码中无缝地使用 C 语言的语法、数据类型、函数和指针,任何合法的 C 代码也是合法的 Objective-C 代码。
// 这是一个完全合法的 Objective-C 文件
#include <stdio.h>
int main(int argc, const char * argv[]) {
printf("Hello, C World!\n");
return 0;
}
b. 消息传递 vs. 方法调用
这是 Objective-C 与 C++、Java、Swift 等语言最核心的区别。
-
传统方法调用:编译器在编译时就知道要执行哪个函数,并将它链接到目标代码中,这是一个静态绑定的过程。
[object method];// 在编译时确定method的地址
-
消息传递:你向一个对象发送一个消息,由对象在运行时决定如何响应这个消息,这被称为动态绑定。
[object message];// 在运行时查找object是否能响应message
这种动态性带来了极大的灵活性,如果一个对象不能响应某个消息,程序不会直接崩溃,而是可以进入一个“转发”机制,甚至可以在运行时动态地为类添加方法。
c. 运行时系统
Objective-C 的强大功能很大程度上归功于其强大的运行时系统,这个系统在程序运行时负责:
- 动态创建类和对象。
- 处理消息的传递和分发。
- 实现方法转发。
- 支持关联对象等高级特性。
开发者可以通过 Objective-C Runtime API 与这个系统进行底层交互。
d. Foundation 框架
Foundation 框架是 Objective-C 的基础,提供了许多核心的数据类型、集合类、实用工具类和协议,它类似于 C++ 的 STL 或 Java 的 java.lang 包。
NSString: 字符串对象(不可变)NSMutableString: 可变字符串NSArray: 不可变数组NSMutableArray: 可变数组NSDictionary: 不可变字典NSMutableDictionary: 可变字典NSNumber: 将基本数据类型包装成对象NSObject: 几乎所有 Objective-C 类的最终父类
语法与核心概念
Objective-C 的语法非常独特,以方括号 [] 和 符号为标志。
a. “Hello, World!” 示例
#import <Foundation/Foundation.h> // 导入 Foundation 框架
int main(int argc, const char * argv[]) {
@autoreleasepool { // 自动释放池,用于管理内存
// 创建一个 NSString 对象,并向它发送 "stringWithUTF8String:" 消息
NSString *greeting = [[NSString alloc] initWithUTF8String:"Hello, World!"];
// 向 greeting 对象发送 "uppercaseString" 消息,并将其结果打印
NSLog(@"%@", [greeting uppercaseString]);
// 不再需要时,释放对象(在 ARC 下是自动的)
// [greeting release];
}
return 0;
}
b. 类的定义与实现
一个类通常分为两个文件:
- 头文件 (
.h): 公共接口声明。 - 实现文件 (
.m): 私有实现细节。
Person.h (接口)
#import <Foundation/Foundation.h> // @interface 声明一个类 // 继承自 NSObject @interface Person : NSObject // 属性声明 // @property 自动生成 getter/setter 方法 // @property (nonatomic, strong) NSString *name; // nonatomic: 非原子操作,性能更高(在多线程环境下不安全) // strong: 强引用,ARC 下的默认引用类型,会保持对象的生命周期 @property (nonatomic, strong) NSString *name; @property (nonatomic, assign) NSInteger age; // assign: 用于基本数据类型 // 方法声明 - (void)sayHello; // 实例方法 + (void)sayClassHello; // 类方法,以 + 开头 @end
Person.m (实现)
#import "Person.h"
// @implementation 实现一个类
@implementation Person
// 实现 sayHello 方法
- (void)sayHello {
NSLog(@"Hello, my name is %@ and I am %ld years old.", self.name, (long)self.age);
}
// 实现 sayClassHello 方法
+ (void)sayClassHello {
NSLog(@"Hello from the Person class!");
}
@end
c. 方法签名
- (减号): 实例方法,作用于类的实例对象上。
- (加号): 类方法,作用于类本身,不需要创建实例即可调用(如
+ alloc)。
方法名解读:
- (void)sayHelloTo:(NSString *)aPerson withGreeting:(NSString *)greeting;
- 这个方法的全名是
sayHelloTo:withGreeting:。 - 第一个参数 (
aPerson) 没有标签,直接跟在方法名后面。 - 后续参数都有标签 (
withGreeting:)。
d. 内存管理
这是 Objective-C 中一个非常重要的主题,分为两个时代:
-
MRC (Manual Reference Counting - 手动引用计数)
- 通过
alloc,new,copy,mutableCopy创建的对象,引用计数为 1。 - 通过
retain方法,引用计数加 1。 - 通过
release方法,引用计数减 1。 - 当引用计数为 0 时,对象被销毁。
- 口诀: 谁创建,谁释放;谁retain,谁release。
- 通过
-
ARC (Automatic Reference Counting - 自动引用计数)
- 从 Xcode 4.2 开始引入,是现代 Objective-C 开发的默认标准。
- 编译器在编译时自动在代码中插入
retain,release,autorelease等代码。 - 开发者不再需要手动管理这些调用,但需要理解四种所有权修饰符:
__strong: 默认类型,持有强引用,对象会一直存活,只要还有强引用指向它。__weak: 弱引用,不持有对象,对象被销毁时,弱引用会自动置为nil,避免“野指针”。__unsafe_unretained: 不安全的弱引用,对象被销毁后,指针依然指向原内存地址,容易造成程序崩溃。__autoreleasing: 用于通过引用传递对象,常见于NSError的处理。
与 Swift 的关系
苹果在 2025 年推出了 Swift 语言,旨在替代 Objective-C。
-
互操作性: 这是两者关系中最重要的一点,你可以在同一个项目中混合使用 Swift 和 Objective-C 代码。
- 从 Swift 调用 Objective-C: 只需将 Objective-C 的头文件(
.h)拖入 Xcode 项目,并命名为YourProjectName-Bridging-Header.h,Swift 代码就可以直接使用 Objective-C 的类和方法。 - 从 Objective-C 调用 Swift: Xcode 会自动生成一个名为
YourProjectName-Swift.h的“桥接头文件”,Objective-C 代码可以通过这个文件导入并使用 Swift 中公开的类和方法。
- 从 Swift 调用 Objective-C: 只需将 Objective-C 的头文件(
-
定位:
- Swift: 现代化的、更安全(类型推断、空安全)、更易学的语言,是所有新项目的首选。
- Objective-C: 成熟、稳定、灵活,是维护旧项目、访问某些特定 C 语言库或需要利用其运行时动态性的首选。
| 特性 | 描述 |
|---|---|
| 定位 | 苹果生态系统的传统主力语言,现与 Swift 并存。 |
| 基础 | C 语言的超集,兼容所有 C 代码。 |
| 核心机制 | 消息传递,而非方法调用,带来动态性。 |
| 内存管理 | ARC (现代) 和 MRC (旧项目)。 |
| 语法 | 以方括号 [] 和 符号为标志,较为冗长。 |
| 框架 | 依赖 Foundation 和 Cocoa (macOS) / Cocoa Touch (iOS) 框架。 |
| 优势 | 动态性、成熟稳定、庞大的代码库、与 C 无缝互操作。 |
| 劣势 | 语法相对繁琐、安全性不如 Swift(在编译时)。 |
学习建议:
- 如果你是新手:直接学习 Swift 更为高效和现代。
- 如果你需要维护旧项目或深入苹果底层:必须学习 Objective-C,学习 Objective-C 也能让你更好地理解苹果框架的设计哲学和运行时机制,反过来也会加深你对 Swift 的理解。
