iOS开发基石:Foundation框架完全指南
从NSObject到集合类,一文读懂OC开发的基础框架
在Objective-C开发中,Foundation框架是所有应用程序的基石。无论你开发的是iOS、macOS还是其他Apple平台的应用,都离不开这个框架。本文将系统讲解Foundation框架的架构、核心组件和实用技巧,帮你建立完整的认知体系。
一、Foundation框架概述
1.1 什么是Foundation?
Foundation框架是Apple为Objective-C提供的基础级框架,它定义了所有Objective-C对象的根类NSObject,并提供了大量基础功能类。可以这样理解它的地位:
- 所有Objective-C代码的根基:几乎所有类都直接或间接继承自NSObject
- 与UI无关的基础服务:包含字符串、集合、日期、文件操作等核心功能
- Cocoa和Cocoa Touch的基础层:为上层UI框架提供支撑
1.2 Foundation的定位
┌─────────────────────────────┐
│ UIKit (UI层) │
├─────────────────────────────┤
│ Foundation (基础层) │
├─────────────────────────────┤
│ Objective-C Runtime │
└─────────────────────────────┘
Foundation框架提供的主要服务包括:
- 值对象(字符串、数字、日期等)
- 集合类(数组、字典、集合等)
- 文件系统和URL操作
- 归档和序列化
- 多线程支持
- 进程间通讯
二、根类:NSObject
2.1 NSObject的核心地位
NSObject是Objective-C类层次结构的根类,所有类都直接或间接继承自它。它定义了对象的:
- 基本行为:对象创建、销毁、内存管理
- 运行时接口:类信息查询、方法调用
- 协议支持:NSCopying、NSCoding等
// 所有对象都继承自NSObject
@interface MyClass : NSObject // 显式继承
// ...
@end
// 即使不写,默认也是继承NSObject
@interface MyClass // 相当于 : NSObject
@end
2.2 NSObject的关键方法
// 对象创建
MyClass *obj = [[MyClass alloc] init];
// 类信息查询
BOOL isKind = [obj isKindOfClass:[MyClass class]];
BOOL responds = [obj respondsToSelector:@selector(someMethod)];
// 内存管理(ARC下很少手动调用)
id retained = [obj retain];
[obj release];
三、值对象(Value Objects)
值对象是将基本数据类型封装为对象的类,使它们可以像对象一样在集合中使用。
3.1 字符串:NSString / NSMutableString
NSString是OC中处理字符串的核心类,比C语言字符串功能强大得多。
创建字符串:
// 字面量创建(最常用)
NSString *str1 = @"Hello World";
// 格式化创建
NSString *str2 = [NSString stringWithFormat:@"年龄:%d", 18];
// 从文件创建
NSString *str3 = [NSString stringWithContentsOfFile:@"path"
encoding:NSUTF8StringEncoding
error:nil];
常用操作:
// 大小写转换
NSString *upper = [@"hello" uppercaseString]; // HELLO
NSString *lower = [@"HELLO" lowercaseString]; // hello
NSString *capital = [@"hello world" capitalizedString]; // Hello World
// 字符串比较
BOOL isEqual = [@"abc" isEqualToString:@"abc"]; // YES
NSComparisonResult result = [@"abc" compare:@"def"]; // NSOrderedAscending
// 前缀/后缀判断
BOOL hasPrefix = [@"abcdef" hasPrefix:@"abc"]; // YES
BOOL hasSuffix = [@"abcdef" hasSuffix:@"def"]; // YES
// 子串查找
NSRange range = [@"abcdef" rangeOfString:@"cde"];
// range.location = 2, range.length = 3
// 字符串截取
NSString *sub1 = [@"abcdef" substringFromIndex:3]; // def
NSString *sub2 = [@"abcdef" substringToIndex:3]; // abc
NSString *sub3 = [@"abcdef" substringWithRange:NSMakeRange(2, 3)]; // cde
// 字符串分割
NSArray *parts = [@"12.abcd.3a" componentsSeparatedByString:@"."];
// @[@"12", @"abcd", @"3a"]
// 类型转换
int num = [@"123" intValue]; // 123
const char *cStr = [@"abc" UTF8String]; // C字符串
3.2 数字:NSNumber
NSNumber是数字类型的对象封装,支持Int、Float、Double、Bool等。
创建和使用:
// 字面量创建(推荐)
NSNumber *intNum = @32;
NSNumber *doubleNum = @3.14;
NSNumber *boolNum = @YES;
NSNumber *charNum = @'A';
// 传统创建
NSNumber *num1 = [NSNumber numberWithInt:32];
NSNumber *num2 = [NSNumber numberWithDouble:3.14];
// 取值
int intValue = [intNum intValue]; // 32
double doubleValue = [doubleNum doubleValue]; // 3.14
BOOL boolValue = [boolNum boolValue]; // YES
3.3 日期与时间:NSDate
// 获取当前日期
NSDate *now = [NSDate date];
// 日期格式化
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
NSString *dateStr = [formatter stringFromDate:now];
// 输出:2026-07-06 14:30:00
// 字符串转日期
NSDate *date = [formatter dateFromString:@"2026-07-06 14:30:00"];
// 日期计算
NSTimeInterval interval = [date2 timeIntervalSinceDate:date1]; // 秒为单位
3.4 包装类:NSValue
NSValue是NSNumber的父类,可以封装任意C数据类型(结构体、指针等):
// 封装结构体
CGPoint point = CGPointMake(10, 20);
NSValue *pointValue = [NSValue valueWithCGPoint:point];
// 解包
CGPoint point2 = [pointValue CGPointValue];
四、集合类(Collection Classes)
集合类用于存储和管理一组对象,所有集合只能存储对象,不能存储基本类型。
4.1 数组:NSArray / NSMutableArray
数组是有序的对象列表,通过索引访问。
创建数组:
// 字面量创建
NSArray *array1 = @[@"A", @"B", @"C"];
// 传统创建(注意:以nil结尾)
NSArray *array2 = [NSArray arrayWithObjects:@"A", @"B", @"C", nil];
// 空数组
NSArray *array3 = [NSArray array];
NSArray *array4 = @[];
常用操作:
// 获取元素个数
NSUInteger count = [array count]; // 3
// 获取元素
NSString *first = array[0]; // 下标访问
NSString *last = [array lastObject]; // 最后一个
// 检查是否包含
BOOL contains = [array containsObject:@"B"]; // YES
// 遍历
for (NSString *item in array) {
NSLog(@"%@", item);
}
// 排序(不可变数组返回新数组)
NSArray *sorted = [array sortedArrayUsingSelector:@selector(compare:)];
可变数组(NSMutableArray):
NSMutableArray *mutableArray = [NSMutableArray array];
// 添加
[mutableArray addObject:@"A"];
[mutableArray addObject:@"B"];
[mutableArray insertObject:@"C" atIndex:0]; // 插入到索引0
// 删除
[mutableArray removeObjectAtIndex:0];
[mutableArray removeLastObject];
[mutableArray removeAllObjects];
// 替换
[mutableArray replaceObjectAtIndex:0 withObject:@"X"];
// 就地排序
[mutableArray sortUsingSelector:@selector(compare:)];
4.2 字典:NSDictionary / NSMutableDictionary
字典存储键值对(Key-Value),通过键来访问值,键通常是字符串。
创建字典:
// 字面量创建
NSDictionary *dict1 = @{
@"name": @"张三",
@"age": @25,
@"city": @"北京"
};
// 传统创建
NSDictionary *dict2 = [NSDictionary dictionaryWithObjectsAndKeys:
@"张三", @"name",
@25, @"age",
nil];
常用操作:
// 取值
NSString *name = dict1[@"name"]; // @"张三"
NSString *name2 = [dict1 objectForKey:@"name"];
// 检查键是否存在
BOOL hasKey = dict1[@"age"] != nil;
// 获取所有键/值
NSArray *allKeys = [dict1 allKeys];
NSArray *allValues = [dict1 allValues];
// 遍历
[dict1 enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
NSLog(@"%@ = %@", key, obj);
}];
可变字典:
NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary];
// 添加/修改
mutableDict[@"name"] = @"李四";
[mutableDict setObject:@30 forKey:@"age"];
// 删除
[mutableDict removeObjectForKey:@"age"];
[mutableDict removeAllObjects];
4.3 集合:NSSet / NSMutableSet
集合存储无序的对象,每个对象只会出现一次,成员测试效率高。
// 创建
NSSet *set = [NSSet setWithObjects:@"A", @"B", @"C", nil];
// 成员测试(比数组快)
BOOL contains = [set containsObject:@"B"]; // YES
// 遍历
for (NSString *item in set) {
NSLog(@"%@", item);
}
4.4 集合使用注意事项
⚠️ 添加nil会导致问题:使用arrayWithObjects:等方法时,nil会作为终止标志,导致后续元素丢失。
id first = @"A";
id second = nil;
id third = @"C";
// ❌ 错误:third不会被添加
NSArray *array = [NSArray arrayWithObjects:first, second, third, nil];
// array只包含@"A"
// ✅ 正确:使用字面量(nil会触发异常)
NSArray *array2 = @[first, second, third]; // 如果second=nil会崩溃
五、常用结构体
Foundation提供了几个常用结构体,用于表示几何和范围信息。
5.1 NSRange(范围)
// 创建
NSRange range1 = NSMakeRange(3, 5); // 起始3,长度5
NSRange range2 = {2, 3};
// 打印(结构体不能用%@直接打印)
NSLog(@"%@", NSStringFromRange(range1)); // {3, 5}
// 判断是否包含
BOOL contains = NSEqualRanges(range1, range2);
5.2 NSPoint / NSSize / NSRect
// 点(与CGPoint等价)
NSPoint point = NSMakePoint(10, 20);
NSPoint point2 = CGPointMake(10, 20);
// 大小(与CGSize等价)
NSSize size = NSMakeSize(100, 200);
NSSize size2 = CGSizeMake(100, 200);
// 矩形(与CGRect等价)
NSRect rect = NSMakeRect(10, 20, 100, 200);
NSRect rect2 = CGRectMake(10, 20, 100, 200);
// 打印
NSLog(@"%@", NSStringFromPoint(point));
NSLog(@"%@", NSStringFromSize(size));
NSLog(@"%@", NSStringFromRect(rect));
六、归档与序列化
归档(Archive)是将对象持久化存储的机制。
6.1 属性列表(Property List)
// 写入plist文件
NSArray *array = @[@"A", @"B", @"C"];
[array writeToFile:@"/path/array.plist" atomically:YES];
// 读取plist文件
NSArray *array2 = [NSArray arrayWithContentsOfFile:@"/path/array.plist"];
6.2 归档(Archiving)
// 归档一个对象到文件
[NSKeyedArchiver archiveRootObject:array toFile:@"/path/archive.dat"];
// 解档
NSArray *array2 = [NSKeyedUnarchiver unarchiveObjectWithFile:@"/path/archive.dat"];
6.3 自定义类归档
// 遵守NSCoding协议
@interface Person : NSObject <NSCoding>
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;
@end
@implementation Person
- (void)encodeWithCoder:(NSCoder *)coder {
[coder encodeObject:self.name forKey:@"name"];
[coder encodeInteger:self.age forKey:@"age"];
}
- (instancetype)initWithCoder:(NSCoder *)coder {
self = [super init];
if (self) {
self.name = [coder decodeObjectForKey:@"name"];
self.age = [coder decodeIntegerForKey:@"age"];
}
return self;
}
@end
七、文件操作
7.1 NSFileManager
NSFileManager *fileManager = [NSFileManager defaultManager];
// 检查文件是否存在
BOOL exists = [fileManager fileExistsAtPath:@"/path/file"];
// 创建目录
[fileManager createDirectoryAtPath:@"/path/dir"
withIntermediateDirectories:YES
attributes:nil
error:nil];
// 复制文件
[fileManager copyItemAtPath:@"/from" toPath:@"/to" error:nil];
// 移动文件
[fileManager moveItemAtPath:@"/from" toPath:@"/to" error:nil];
// 删除文件
[fileManager removeItemAtPath:@"/path" error:nil];
7.2 NSBundle
// 获取应用程序的Bundle
NSBundle *mainBundle = [NSBundle mainBundle];
// 获取资源路径
NSString *path = [mainBundle pathForResource:@"config" ofType:@"plist"];
// 读取资源
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
八、总结
Foundation框架是OC开发的基石,掌握它意味着你能熟练处理:
- 对象管理:NSObject及对象生命周期
- 值对象:NSString、NSNumber、NSDate等
- 集合类:NSArray、NSDictionary、NSSet
- 文件系统:NSFileManager、NSBundle
- 持久化:归档和序列化
- 几何结构:NSRange、NSPoint、NSSize、NSRect
// Foundation框架导入
#import <Foundation/Foundation.h> // 导入所有Foundation类
学习建议:
- 熟练掌握NSString和NSArray的操作,它们是日常开发中最常用的类
- 理解可变(Mutable)与不可变(Immutable)的区别
- 熟悉集合类的遍历和查找方法
- 了解归档机制,为数据持久化打下基础
617

被折叠的 条评论
为什么被折叠?



