Objective-C 之 Foundation框架 详解

发布时间:2026/7/7 1:54:32
Objective-C 之 Foundation框架 详解 iOS开发基石Foundation框架完全指南从NSObject到集合类一文读懂OC开发的基础框架在Objective-C开发中Foundation框架是所有应用程序的基石。无论你开发的是iOS、macOS还是其他Apple平台的应用都离不开这个框架。本文将系统讲解Foundation框架的架构、核心组件和实用技巧帮你建立完整的认知体系。一、Foundation框架概述1.1 什么是FoundationFoundation框架是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操作归档和序列化多线程支持进程间通讯二、根类NSObject2.1 NSObject的核心地位NSObject是Objective-C类层次结构的根类所有类都直接或间接继承自它。它定义了对象的基本行为对象创建、销毁、内存管理运行时接口类信息查询、方法调用协议支持NSCopying、NSCoding等// 所有对象都继承自NSObjectinterfaceMyClass:NSObject// 显式继承// ...end// 即使不写默认也是继承NSObjectinterfaceMyClass// 相当于 : NSObjectend2.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 / NSMutableStringNSString是OC中处理字符串的核心类比C语言字符串功能强大得多。创建字符串// 字面量创建最常用NSString*str1Hello World;// 格式化创建NSString*str2[NSString stringWithFormat:年龄%d,18];// 从文件创建NSString*str3[NSString stringWithContentsOfFile:pathencoding:NSUTF8StringEncoding error:nil];常用操作// 大小写转换NSString*upper[hellouppercaseString];// HELLONSString*lower[HELLOlowercaseString];// helloNSString*capital[hello worldcapitalizedString];// Hello World// 字符串比较BOOL isEqual[abcisEqualToString:abc];// YESNSComparisonResult result[abccompare:def];// NSOrderedAscending// 前缀/后缀判断BOOL hasPrefix[abcdefhasPrefix:abc];// YESBOOL hasSuffix[abcdefhasSuffix:def];// YES// 子串查找NSRange range[abcdefrangeOfString:cde];// range.location 2, range.length 3// 字符串截取NSString*sub1[abcdefsubstringFromIndex:3];// defNSString*sub2[abcdefsubstringToIndex:3];// abcNSString*sub3[abcdefsubstringWithRange:NSMakeRange(2,3)];// cde// 字符串分割NSArray*parts[12.abcd.3acomponentsSeparatedByString:.];// [12, abcd, 3a]// 类型转换intnum[123intValue];// 123constchar*cStr[abcUTF8String];// C字符串3.2 数字NSNumberNSNumber是数字类型的对象封装支持Int、Float、Double、Bool等。创建和使用// 字面量创建推荐NSNumber*intNum32;NSNumber*doubleNum3.14;NSNumber*boolNumYES;NSNumber*charNumA;// 传统创建NSNumber*num1[NSNumber numberWithInt:32];NSNumber*num2[NSNumber numberWithDouble:3.14];// 取值intintValue[intNum intValue];// 32doubledoubleValue[doubleNum doubleValue];// 3.14BOOL boolValue[boolNum boolValue];// YES3.3 日期与时间NSDate// 获取当前日期NSDate*now[NSDate date];// 日期格式化NSDateFormatter*formatter[[NSDateFormatter alloc]init];formatter.dateFormatyyyy-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 包装类NSValueNSValue是NSNumber的父类可以封装任意C数据类型结构体、指针等// 封装结构体CGPoint pointCGPointMake(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*firstarray[0];// 下标访问NSString*last[array lastObject];// 最后一个// 检查是否包含BOOL contains[array containsObject:B];// YES// 遍历for(NSString*iteminarray){NSLog(%,item);}// 排序不可变数组返回新数组NSArray*sorted[array sortedArrayUsingSelector:selector(compare:)];可变数组NSMutableArrayNSMutableArray*mutableArray[NSMutableArray array];// 添加[mutableArray addObject:A];[mutableArray addObject:B];[mutableArray insertObject:CatIndex:0];// 插入到索引0// 删除[mutableArray removeObjectAtIndex:0];[mutableArray removeLastObject];[mutableArray removeAllObjects];// 替换[mutableArray replaceObjectAtIndex:0withObject: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*namedict1[name];// 张三NSString*name2[dict1 objectForKey:name];// 检查键是否存在BOOL hasKeydict1[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:30forKey: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*iteminset){NSLog(%,item);}4.4 集合使用注意事项⚠️添加nil会导致问题使用arrayWithObjects:等方法时nil会作为终止标志导致后续元素丢失。id firstA;id secondnil;id thirdC;// ❌ 错误third不会被添加NSArray*array[NSArray arrayWithObjects:first,second,third,nil];// array只包含A// ✅ 正确使用字面量nil会触发异常NSArray*array2[first,second,third];// 如果secondnil会崩溃五、常用结构体Foundation提供了几个常用结构体用于表示几何和范围信息。5.1 NSRange范围// 创建NSRange range1NSMakeRange(3,5);// 起始3长度5NSRange range2{2,3};// 打印结构体不能用%直接打印NSLog(%,NSStringFromRange(range1));// {3, 5}// 判断是否包含BOOL containsNSEqualRanges(range1,range2);5.2 NSPoint / NSSize / NSRect// 点与CGPoint等价NSPoint pointNSMakePoint(10,20);NSPoint point2CGPointMake(10,20);// 大小与CGSize等价NSSize sizeNSMakeSize(100,200);NSSize size2CGSizeMake(100,200);// 矩形与CGRect等价NSRect rectNSMakeRect(10,20,100,200);NSRect rect2CGRectMake(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.plistatomically: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协议interfacePerson:NSObjectNSCodingproperty(nonatomic,copy)NSString*name;property(nonatomic,assign)NSInteger age;endimplementationPerson-(void)encodeWithCoder:(NSCoder*)coder{[coder encodeObject:self.name forKey:name];[coder encodeInteger:self.age forKey:age];}-(instancetype)initWithCoder:(NSCoder*)coder{self[superinit];if(self){self.name[coder decodeObjectForKey:name];self.age[coder decodeIntegerForKey:age];}returnself;}end七、文件操作7.1 NSFileManagerNSFileManager*fileManager[NSFileManager defaultManager];// 检查文件是否存在BOOL exists[fileManager fileExistsAtPath:/path/file];// 创建目录[fileManager createDirectoryAtPath:/path/dirwithIntermediateDirectories:YES attributes:nil error:nil];// 复制文件[fileManager copyItemAtPath:/fromtoPath:/toerror:nil];// 移动文件[fileManager moveItemAtPath:/fromtoPath:/toerror:nil];// 删除文件[fileManager removeItemAtPath:/patherror:nil];7.2 NSBundle// 获取应用程序的BundleNSBundle*mainBundle[NSBundle mainBundle];// 获取资源路径NSString*path[mainBundle pathForResource:configofType:plist];// 读取资源NSDictionary*dict[NSDictionary dictionaryWithContentsOfFile:path];八、总结Foundation框架是OC开发的基石掌握它意味着你能熟练处理对象管理NSObject及对象生命周期值对象NSString、NSNumber、NSDate等集合类NSArray、NSDictionary、NSSet文件系统NSFileManager、NSBundle持久化归档和序列化几何结构NSRange、NSPoint、NSSize、NSRect// Foundation框架导入#importFoundation/Foundation.h// 导入所有Foundation类学习建议熟练掌握NSString和NSArray的操作它们是日常开发中最常用的类理解可变Mutable与不可变Immutable的区别熟悉集合类的遍历和查找方法了解归档机制为数据持久化打下基础