Objective-C 基础教程
前言:为什么学习 Objective-C?
在 Swift 成为 iOS 和 macOS 开发首选语言的今天,学习 Objective-C 仍然具有非常重要的价值:

- 维护遗留项目:许多大型应用和重要的开源库(如 AFNetworking, Masonry)仍然是 Objective-C 编写的,作为一名专业的 iOS/macOS 开发者,阅读和维护这些代码是必备技能。
- 理解底层原理:Objective-C 是一门动态语言,它的运行时机制是 iOS/macOS 系统的核心,学习 OC 能让你更深刻地理解消息转发、关联对象、KVO/KVC 等技术的底层工作原理,这反过来会让你对 Swift 的理解更上一层楼。
- 与 C 语言无缝集成:OC 是 C 语言的超集,你可以直接在 OC 代码中使用 C 语言的特性,如指针、结构体等,这对于性能优化和与系统底层交互至关重要。
- 历史传承:了解 OC 是理解 Apple 开发生态历史的一部分。
第一部分:环境搭建与基础语法
第一章:开发环境配置
- 安装 Xcode:
- 从 Mac App Store 下载并安装最新版的 Xcode。
- Xcode 是一个集成的开发环境,包含了代码编辑器、编译器、调试器、模拟器等所有必需的工具。
- 创建第一个项目:
- 打开 Xcode,选择 "Create a new Xcode project"。
- 选择 "macOS" -> "Command Line Tool",语言选择 "Objective-C"。
- 创建项目后,你会看到几个关键文件:
main.m: 程序的入口点,包含main函数。YourProjectName.m: 你的主实现文件。YourProjectName.h: 你的主头文件,用于声明接口。
第二章:语言基础 - "C" 的部分
因为 OC 是 C 的超集,所以首先需要掌握 C 的基础。
- 基本数据类型:
int,float,double,char,BOOL(OC中,YES/NO是1/0的宏定义)。
- 变量与常量:
- 变量声明:
int age = 25; - 常量声明:
const int MAX_AGE = 100;或#define MAX_AGE 100(宏定义)。
- 变量声明:
- 运算符:
- 算术运算符 (, , , , )。
- 关系运算符 (, ,
>,<)。 - 逻辑运算符 (
&&, , )。
- 流程控制:
if-else条件语句。for,while,do-while循环语句。switch开关语句。
第三章:语言基础 - "Objective" 的部分
这是 OC 的核心,面向对象编程。
-
基本概念:
- 类:创建对象的蓝图,声明在
.h文件中,实现放在.m文件中。 - 对象:类的实例,在内存中占据空间。
- 方法:定义在类中的函数,分为实例方法和类方法。
- 消息:在 OC 中,调用方法被称为“发送消息”。
[object method]。
- 类:创建对象的蓝图,声明在
-
类的声明与实现:
(图片来源网络,侵删)-
头文件 (.h) - 接口文件:
// Person.h #import <Foundation/Foundation.h> @interface Person : NSObject { // 实例变量,通常使用 @property 替代 int _age; } // 属性声明 @property (nonatomic, assign) int age; @property (nonatomic, copy) NSString *name; // 方法定义 - (void)walk; + (void)sayHello; @end -
实现文件 (.m) - 实现文件:
// Person.m #import "Person.h" @implementation Person // 属性的合成(自动生成 getter/setter) // @synthesize age = _age; // 现代Xcode会自动合成,无需手动写 // 实例方法实现 - (void)walk { NSLog(@"%@ is walking.", self.name); } // 类方法实现 (以 + 开头) + (void)sayHello { NSLog(@"Hello from Person class!"); } @end
-
-
方法详解:
- 实例方法:以 (减号) 开头,作用于对象实例。
- (void)walk;。 - 类方法:以 (加号) 开头,作用于类本身,不需要创建实例。
+ (void)sayHello;。 - 方法签名:
- (返回类型)方法名:(参数类型)参数名;- (void)setAge:(int)newAge;- 多个参数:
- (void)setAge:(int)newAge andName:(NSString *)newName;
- 实例方法:以 (减号) 开头,作用于对象实例。
-
self关键字:
(图片来源网络,侵删)self指代当前对象实例,类似于 C++/Java/Python 中的this。- 用于在方法内部访问当前对象的属性和其他方法。
[self walk];。
-
消息发送与响应:
[receiver message]是 OC 调用方法的标准语法。- 如果对象无法响应某个消息,程序会抛出异常,这被称为“未选择器”异常。
第二部分:核心概念与高级特性
第四章:属性
属性是封装对象数据的首选方式,它自动生成 getter 和 setter 方法。
@property:在.h文件中声明属性。- 属性修饰符:
- 原子性:
atomic(默认):线程安全,但性能开销大。nonatomic:非线程安全,性能更好,在 iOS 开发中几乎总是使用这个。
- 内存管理语义:
assign:用于基本数据类型 (int,float,CGRect等),简单赋值,不涉及内存管理。strong(现代推荐):强引用,持有对象,对象会一直存在直到没有强引用指向它,用于对象类型。weak:弱引用,不持有对象,当对象被销毁时,指针会自动置为nil,常用于解决循环引用,如 delegate、outlet。copy:复制对象,创建一个不可变副本,用于防止外部修改影响内部数据,常用于NSString,NSArray,NSDictionary等可变对象。retain:旧版的strong,现在不推荐使用。
- 读写权限:
readwrite(默认):同时生成 getter 和 setter。readonly:只生成 getter。
- 原子性:
第五章:内存管理
这是 OC 最重要也最容易出错的部分。
- 原则:谁创建,谁释放;谁 retain,谁 release。
- 引用计数:
- 每个对象都有一个引用计数器。
alloc,new,copy,mutableCopy会让计数器 +1。retain会让计数器 +1。release会让计数器 -1。- 当计数器为 0 时,对象会被销毁。
@autoreleasepool:- 自动释放池,将暂时不需要但又不希望立即释放的对象放入其中,在池子被 drain 时,统一向这些对象发送
release消息。 ARC会自动管理,但理解其原理很重要。
- 自动释放池,将暂时不需要但又不希望立即释放的对象放入其中,在池子被 drain 时,统一向这些对象发送
- ARC (Automatic Reference Counting):
- 现代 OC 开发必须使用,Xcode 默认开启。
- 编译器在编译时自动插入
retain,release,autorelease代码,开发者无需手动管理。 - 所有权修饰符:
__strong(默认):等同于strong。__weak:等同于weak。__unsafe_unretained:等同于assign,但用于对象,不安全(对象销
