新闻详情

新闻详情

首页 / 资讯中心 / 详情

Objective-C 之 Foundation框架 详解

发布时间:2026/9/8 22:50:59来源:尧图网络
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的区别熟悉集合类的遍历和查找方法了解归档机制为数据持久化打下基础
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Starship “No Nerd Font“ 预设全解:不安装 Nerd Font 也能完整渲染全部模块符号 2026/9/8 22:50:33

Starship “No Nerd Font“ 预设全解:不安装 Nerd Font 也能完整渲染全部模块符号

Starship "No Nerd Font" 预设全解:不安装 Nerd Font 也能完整渲染全部模块符号 【免费下载链接】starship ☄🌌️ The minimal, blazing-fast, and infinitely customizable prompt for any shell! 项目地址: https://gitcode.com/GitHub_T…

阅读更多 →
2026年实测这3个口碑爆棚的AI智能降重工具,毕业论文AIGC检测达标毫无压力! 2026/9/8 22:50:33

2026年实测这3个口碑爆棚的AI智能降重工具,毕业论文AIGC检测达标毫无压力!

最近辅导学弟学妹写论文,发现一个明显的变化:大家不再只担心查重率高,更怕的是被AIGC检测出痕迹。导师一句“AI痕迹太重”,可能直接让整篇论文前功尽弃。现在知网、维普的AI检测红线卡在10%,一旦超标就存在风险。网上各…

阅读更多 →
LlamaIndex 中的 LanceDB 多模态托管索引:LanceDBMultiModalIndex 全解析 2026/9/8 22:50:33

LlamaIndex 中的 LanceDB 多模态托管索引:LanceDBMultiModalIndex 全解析

LlamaIndex 中的 LanceDB 多模态托管索引:LanceDBMultiModalIndex 全解析 【免费下载链接】llama_index LlamaIndex is the leading document agent and OCR platform 项目地址: https://gitcode.com/GitHub_Trending/ll/llama_index 本文基于 LlamaIndex 仓…

阅读更多 →
Docling 解析 LaTeX 学术论文实战:从 arXiv 2501.00089 天体物理论文看 Docling 的 LaTeX→Markdown 转换管线 2026/9/8 22:50:33

Docling 解析 LaTeX 学术论文实战:从 arXiv 2501.00089 天体物理论文看 Docling 的 LaTeX→Markdown 转换管线

Docling 解析 LaTeX 学术论文实战:从 arXiv 2501.00089 天体物理论文看 Docling 的 LaTeX→Markdown 转换管线 【免费下载链接】docling Get your documents ready for gen AI 项目地址: https://gitcode.com/GitHub_Trending/do/docling 导读 本文围绕 Doc…

阅读更多 →
BMC固件工程师:服务器健康系统的底层调度者 2026/9/8 22:50:33

BMC固件工程师:服务器健康系统的底层调度者

1. BMC固件工程师不是“写BIOS的”,而是服务器健康系统的总调度员很多人第一次听说BMC(Baseboard Management Controller),下意识会把它和主板BIOS划等号——毕竟都跑在板子上、都带“固件”俩字、都能进底层。但这种类比就像把消…

阅读更多 →
AI前沿日报:Agent工程化、AI编程、视频生成与企业落地全解析 2026/9/8 22:47:32

AI前沿日报:Agent工程化、AI编程、视频生成与企业落地全解析

今天是2026年9月1日,周二。我照例在早上七点半坐到电脑前,趁咖啡还烫手,把过去24小时里 AI 领域值得看的东西梳理了一遍。这份“AI 前沿日报”我已经写了快两年,从一开始的模型发布号外,到现在的 Agent 工程实践、内容…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞