Objective-C 之 Foundation框架 详解

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

NSValueNSNumber的父类,可以封装任意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类

学习建议:

  1. 熟练掌握NSString和NSArray的操作,它们是日常开发中最常用的类
  2. 理解可变(Mutable)与不可变(Immutable)的区别
  3. 熟悉集合类的遍历和查找方法
  4. 了解归档机制,为数据持久化打下基础
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐诺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值