处理字符串时总搞不定拼接和比较?操作数组时动不动就崩溃,还不知道问题出在哪?不少新手朋友跟我吐槽,Objective-C 里的 NSString 和 NSArray 看着简单,实际用起来全是小坑 —— 字符串比较用 == 结果总不对,数组添加元素提示 “不可变”,截取子串位置算不准。其实啊,这两个类是 Objective-C 里最常用的 “工具人”,字符串处理、数据存储都离不开它们。今天兔子哥就把这两个类的必学方法拆解开,附上学员实战踩过的坑和解决办法,新手跟着练,处理字符串和数组再也不用查半天文档了!
一、NSString:字符串处理的 “万能工具”,这 8 个方法必须会
NSString 是处理文本的核心类,不管是显示文字、拼接内容还是判断格式,都得靠它。新手掌握这几个方法,80% 的字符串需求都能搞定。
1. 创建字符串:不止一种方式,选对场景用对方法
创建字符串最常用的有两种方式,各有各的用处:
objective-c
// 直接创建(适合固定文本)NSString *str1 = @"Hello Objective-C";// 格式化创建(适合拼接变量,类似printf)NSString *name = @"小明";int age = 20;NSString *str2 = [NSString stringWithFormat:@"姓名:%@,年龄:%d", name, age];NSLog(@"%@", str2); // 输出:姓名:小明,年龄:20避坑点:格式化时别漏写格式符!%@对应对象(如 NSString),% d 对应整数,写错会导致输出乱码。之前有学员把 %@写成 % d 打印字符串,结果输出一串数字,查了半天才发现问题。
2. 字符串长度:别用错方法,中文英文都能算
想知道字符串有多少个字符,用 length 方法:
objective-c
NSString *text = @"Objective-C编程";NSUInteger length = text.length; // NSUInteger是无符号整数类型NSLog(@"长度:%lu", length); // 输出:11(字母、符号、中文都算一个字符)学员经验:“之前以为中文需要特殊处理,没想到 length 直接能算,省了好多事!”
3. 字符串比较:千万别用 ==,要用 isEqualToString
新手最容易犯的错就是用 == 比较字符串,结果永远不对:
objective-c
NSString *a = @"苹果";NSString *b = @"苹果";NSString *c = [NSString stringWithFormat:@"%@", a];// 错误写法:==比较的是地址,不是内容if (a == b) {NSLog(@"a和b地址相同"); // 可能输出,因为常量字符串地址相同}if (a == c) {NSLog(@"a和c地址相同"); // 不会输出,c是新创建的对象}// 正确写法:用isEqualToString比较内容if ([a isEqualToString:c]) {NSLog(@"a和c内容相同"); // 会输出,内容一样}记住:比较字符串内容必须用
isEqualToString,== 只能比较两个变量是否指向同一个对象,新手一定要改过来这个习惯!4. 字符串拼接与截取:灵活处理文本内容
拼接字符串除了 stringWithFormat,还能用 stringByAppendingString:
objective-c
NSString *pre = @"Hello";NSString *suf = @"World";NSString *full = [pre stringByAppendingString:suf]; // 拼接成HelloWorld// 带分隔符拼接NSString *fullWithSpace = [pre stringByAppendingFormat:@" %@", suf]; // 拼接成Hello World// 截取子串:从索引2开始,取5个字符(索引从0开始)NSString *text = @"Objective-C";NSString *sub = [text substringWithRange:NSMakeRange(2, 5)];NSLog(@"%@", sub); // 输出:jective(从第3个字符开始取5个)截取时注意:索引不能超过字符串长度,不然会崩溃!可以先判断长度:
objective-c
if (text.length >= 7) { // 开始索引2+长度5=7,必须小于等于总长度// 安全截取}二、NSArray:数组操作的 “基本功”,可变与不可变要分清
NSArray 是存储多个对象的容器,但新手常分不清 “不可变” 和 “可变” 的区别,导致操作时总报错。
1. 不可变数组 NSArray:创建后不能改,适合存固定数据
NSArray 创建后不能添加、删除元素,只能查询:
objective-c
// 创建数组(最后加nil表示结束,不能漏)NSArray *fruits = [NSArray arrayWithObjects:@"苹果", @"香蕉", @"橙子", nil];// 快捷创建方式(更简单,推荐用这个)NSArray *colors = @[@"红", @"绿", @"蓝"];// 获取元素(索引从0开始)NSString *firstFruit = fruits[0]; // 苹果NSString *secondColor = [colors objectAtIndex:1]; // 绿(两种写法都可以)// 获取数组长度NSUInteger count = fruits.count; // 3避坑点:访问索引时别越界!如果数组长度是 3,最大索引是 2,访问索引 3 会直接崩溃。新手一定要记住:
index < array.count才能安全访问。2. 可变数组 NSMutableArray:可添加删除,适合动态数据
如果需要修改数组内容,必须用 NSMutableArray(继承自 NSArray):
objective-c
// 创建可变数组NSMutableArray *animals = [NSMutableArray arrayWithObjects:@"猫", @"狗", nil];// 添加元素[animals addObject:@"鸡"]; // 现在数组是[@"猫", @"狗", @"鸡"]// 插入元素到指定位置[animals insertObject:@"鸭" atIndex:1]; // 插入到索引1,数组变成[@"猫", @"鸭", @"狗", @"鸡"]// 删除元素[animals removeObjectAtIndex:2]; // 删除索引2的元素,数组变成[@"猫", @"鸭", @"鸡"]// 清空数组// [animals removeAllObjects];学员踩坑经历:“刚开始不知道 NSArray 不可变,想调用 addObject 结果报错,查了才知道要用 NSMutableArray,原来名字里带 Mutable 才是可变的!”
3. 数组遍历:三种方法,按需选择
遍历数组是高频操作,这三种方法最常用:
objective-c
NSArray *books = @[@"Objective-C入门", @"iOS开发实战", @"Swift教程"];// 方法1:for循环(适合需要索引的场景)for (int i = 0; i < books.count; i++) {NSLog(@"索引%d:%@", i, books[i]);}// 方法2:快速枚举(最简洁,推荐)for (NSString *book in books) {NSLog(@"书名:%@", book);}// 方法3:block遍历(适合需要复杂逻辑的场景)[books enumerateObjectsUsingBlock:^(NSString *book, NSUInteger idx, BOOL *stop) {NSLog(@"索引%d的书:%@", idx, book);if ([book isEqualToString:@"iOS开发实战"]) {*stop = YES; // 找到目标后停止遍历}}];新手推荐用快速枚举,代码少不容易错;需要索引或中途停止时,再用 for 循环或 block 遍历。
4. 数组排序:简单几行代码搞定
给数组排序不用自己写算法,NSArray 自带排序方法:
objective-c
NSArray *numbers = @[@3, @1, @4, @2];// 升序排序(从小到大)NSArray *sortedNumbers = [numbers sortedArrayUsingSelector:@selector(compare:)];NSLog(@"%@", sortedNumbers); // 输出:1,2,3,4// 字符串数组排序(按字母/拼音顺序)NSArray *names = @[@"张三", @"李四", @"王五"];NSArray *sortedNames = [names sortedArrayUsingSelector:@selector(compare:)];如果需要自定义排序规则(比如按字符串长度),可以用 block 排序,新手阶段先掌握基础排序就行。
三、新手必看:NSString 和 NSArray 的避坑汇总
1. NSString 常见坑
- 用 == 比较内容:记住必须用
isEqualToString,== 只比较地址。 - 格式化字符串漏写格式符:%@对应对象,% d 对应整数, mismatch 会导致崩溃或乱码。
- 截取子串越界:截取前先判断
range.location + range.length <= string.length。
2. NSArray 常见坑
- 混淆不可变与可变:NSArray 不能添加删除元素,想修改必须用 NSMutableArray。
- 数组越界访问:访问索引前先检查
index < array.count,尤其循环里别写i <= array.count。 - 存储基本数据类型:NSArray 只能存对象,存整数、浮点数要包装成 NSNumber,比如
@123@3.14。
四、实战小练习:用 NSString 和 NSArray 做个简单通讯录
自己动手练才记得牢,咱做个简易通讯录,存联系人姓名和电话,实现添加和查询功能:
objective-c
// 创建可变数组存联系人(每个联系人是字典)NSMutableArray *contacts = [NSMutableArray array];// 添加联系人NSDictionary *contact1 = @{@"name": @"张三", @"phone": @"13800138000"};[contacts addObject:contact1];NSDictionary *contact2 = @{@"name": @"李四", @"phone": @"13900139000"};[contacts addObject:contact2];// 遍历查询所有联系人NSLog(@"所有联系人:");for (NSDictionary *c in contacts) {NSString *info = [NSString stringWithFormat:@"姓名:%@,电话:%@", c[@"name"], c[@"phone"]];NSLog(@"%@", info);}// 根据姓名查电话NSString *targetName = @"李四";for (NSDictionary *c in contacts) {if ([c[@"name"] isEqualToString:targetName]) {NSLog(@"找到%@的电话:%@", targetName, c[@"phone"]);break;}}这个练习用到了 NSString 的拼接、比较,NSMutableArray 的添加、遍历,新手试着敲一遍,能巩固不少知识点。
兔子哥觉得,NSString 和 NSArray 是 Objective-C 的 “基石”,几乎所有项目都离不开它们。刚开始可能觉得方法多不好记,但用多了就会发现,常用的就那几个,重点是理解 “不可变” 和 “可变” 的区别,以及字符串比较、数组索引这些细节。
其实新手不用死记所有方法,用到的时候查文档就行,但核心方法(比如 isEqualToString、addObject)必须练熟,不然写代码时会频繁卡壳。之前有个学员做项目时,因为数组越界崩溃了好几次,后来养成了先判断索引的习惯,代码稳定多了。
最后想说,处理字符串和数组就像盖房子时搬砖和垒墙,基础打不好,后面的复杂功能就没法实现。多做几个小练习,比如通讯录、待办清单,把这些方法用熟,你会发现 Objective-C 编程越来越顺手,加油!
标签: stringWithFormat isEqualToString
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~