OC课程-017: NSMutableString NSArray NSMutableArray

二、NSMutableString


176.NSMutableString

1). 是Foundation框架中的一个类,从NSString继承,是用来存储字符串数据的.
2). NSMutableString在父类NSString的基础之上做扩展,
存储在NSMutableString对象中的数据具有可变性,不会新创建对象.


177. NSMutableString的用法

1). 创建对象:
NSMutableString *str = [NSMutableString string];
[str appendString:@"jack"]; // 追加字符串。
2). 往可变字符串对象中追加字符串:

(void)appendString:(NSString *)aString;// 直接追加内容
(void)appendFormat:(NSString *)format...;// 以拼接的方式往可变字符串对象中追加内容

3). 创建NSMutableString对象时,不能使用如下方式:
NSMutableString *str = @"jack";
4). NSMutableString做大批量的字符串拼接,速度快,因为NSMutableString只有一个,每次修改的时候直接修改对象的内容。
NSMutableString是从NSString继承,在使用NSString的地方,完全可以使用NSMutableString。

6. 使用建议

1). 平时使用,还是使用NSString,因为效率高。
第二次使用同1个字符串,不需要再创建,可直接使用。

    NSString *str1 = @"jack";
    NSString *str2 = @"jack";

2). 大批量的数据拼接的时候使用NSMutableString
10次以上使用NSMutableString. 此时NSString拼接,效率低下。


178. NSArray的用法

1. NSArray,具备数组功能。是OC中的数组。

1). 是Foundation框架中的一个类,用来存储多个数据,具备数组功能,所以NSArray是OC中的数组
2). NSArray的特点:
a. 只能存储OC对象
b. 长度固定, 一旦NSArray数组创建完毕之后,元素的长度固定,无法新增、删除元素.
c. 每一个元素都是紧密相连的,每一个元素仍然有自己的下标.
d. 元素的类型是id类型的.只能存OC对象类型。

3). NSArray数组的创建:
1). 因为是一个类,所以就是创建NSArray对象.

NSArray *arr1 = [NSArray new]; 
NSArray *arr2 = [[NSArray alloc] init];
NSArray *arr3 = [NSArray array];

这样创建出来的NSArray数组的元素的个数是0个,因为长度固定,所以没有任何意义.
2). 创建数组的同时指定一个数组的元素,仍然没有意义
NSArray *arr1 = [NSArray arrayWithObject:@"jack"];
3). 最常用创建NSArray数组的方式.

  • (instancetype)arrayWithObjects:(ObjectType)firstObj,...
    NSArray *arr1 = [NSArray arrayWithObjects:@"jack",@"rose",@"lili",nil];
    4). 创建NSArray简要方式
    NSArray *arr = @[@"jack", @"rose", @"lili"];
    5). 使用注意
    a. 只能存储OC对象,不能存储非OC对象
    b. 将元素写完之后,最后要写一个nil,表示元素到此结束了

179. NSArray的用法

  1. 在NSLog函数中使用%@可以直接输出 NSArray对象中的所有元素的值。
  2. NSArray数组中不能存储基本数据类型。不能存储非OC对象。
    nil的本质其实就是0,所以nil无法存储到NSArray数组中。
  3. 可以通过下标index,取出数组中的值。
  4. 得到数组中元素的个数:arr.count;
  5. 判断数组中是否有指定元素:[arr containsObject:@"lily"];
  6. 第一个元素:arr.firstObject
  7. 最后元素:arr.lastObject
  8. 查找数组中第一次出现item的下标。
    indexOfObject,如果没找到,返回的是NSUInteger的最大值。

180. NSArray的用法

NSArray数组的编译
1). for循环
原理: 将下标挨个遍历出来

    NSArray *arr = @[@"jack",@"rose"];
    for(int i=0;i<arr.count;i++){
        //NSLog(@"%@",arr[i]);
        NSLog(@"%@", [arr objectAtIndex:i]);
    }

2). 使用增强for循环
a. 语法格式:
for(元素类型 变量名 in 数组名){
直接通过变量名拿到数组中的每一个元素
}

NSArray *arr = @[@"jack",@"rose"]; 
for(NSString *str in arr){
     NSLog(@"%@", str); 
}

b. 声明在for()中的变量叫做迭代变量
c. 执行变量
将数组中的第一个元素的值赋值给迭代变量,执行循环体
...
结束循环
d. 语法总结
-> 迭代变量的类型和数组中的元素的类型保持一致
-> 迭代变量的名称可以任意取
-> in是固定的
-> 遍历那个数组就将数组写在in后面
-> 循环体里面,迭代变量的值就是元素的值

当NSArray数组中存储的数据类型不一致的时候,迭代变量的类型建议使用id类型

3). 使用block遍历:enumerateObjectsUsingBlock
(void) enumerateObjectsUsingBlock:(void (^)OjbectType obj, NSUInteger idx, BOOL *stop))block;
idx:是每个元素的下标index。
obj:代表遍历出来的元素的值。
*stop:是否继续遍历的标志,YES停止,NO不停止。
这是一个方法,这个方法作用来遍历数组中的每一个元素

    NSArray *arr = @[@"jack",@"rose"];
    // 将arr数组中的每一个元素遍历出来
    [arr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop){
        NSLog(@"%@", obj);
        // 如果想停止循环,就将*stop设置为YES
    }]; 

NSArray和NSString 的方法。

1). 将数组中元素连接起来组成一个新的字符串
(NSString *)componentsJoinedByString:(NSString *)separator
参数: 连接符

    NSArray *arr = @[@"jack", @"rose", @"lili"];
    NSString *str = [arr componentsJoinedByString:@"#"];

2). 将字符串按指定分隔符分割

    NSString *str = @"北京,昌平区,传智";
    // 使用字符串进行分割
    NSArray *arr = [str componentsSeparatedByString:","];

NSMutableArray是NSArray的子类

1). NSMutableArray仍然是一个数组,就被NSArray的特点,只能存储OC对象,每一个元素是紧密相连的。
2). NSMutableArray相对于父类做的扩展,NSMutableArray数组的元素可以动态的新增和删除,其他用法与NSArray一致。
所以:
NSArray数组一旦创建,其元素的个数就固定,无法新增与删除
NSMutableArray数组,可以新增删除.

3). NSMutableArray数组的创建

NSMutableArray *arr1 = [NSMutableArray new];
NSMutableArray *arr2 = [[NSMutableArray alloc] init]; 
NSMutableArray *arr3 = [NSMutableArray array];
NSMutableArray *arr4 = [NSMutableArray arrayWithObjects:@"jack", @"rose", @"lili", nil];

这样创建出来的数组对象,数组的元素是0,但是有意义,可以动态的新增,删除.
最容易犯错:这样写不可以. 这时NSArray对象的简写。
NSMutableArray *arr1 = @[@"jack", @"rose", @"lili"];

新增与删除

新增

a. // 将传入的参数作为数组的元素添加进去
- (void)addObject:(ObjectType)anObject;
// 将另外一个数组中的每一个元素添加到可变数组中
- (void)addObjectsFromArray:(NSArray<ObjectType> *)otherArray;

NSMutableArray *arr1 = [NSMutableArray new]; 
[arr1 addObject:@"jack"]; 
NSArray *arr = @[@"jack", @"rose", @"lili"]; 
[arr1 addObjectsFromArray:arr];

b. 在可变数组中指定的数组中插入一个元素
- (void)insertObject:(ObjectType)anObject atIndex:(NSUInteger)index;
[arr insertObject:@"lilei", atIndex:1]; // 可变数组的中间,插入元素

删除

a. 删除
// 删除指定下标的元素
- (void) removeObjectAtIndex:(NSUInteger)index;

NSMutableArray *arr1 = [NSMutableArray new]; 
[arr1 addObject:@"jack"]; 
NSArray *arr = @[@"jack", @"rose", @"lili"]; 
[arr1 addObjectsFromArray:arr]; 
[arr removeObjectAtIndex:1];

b. 删除特定的元素
- (void)removeObject:(ObjectType)anObject;

NSMutableArray *arr1 = [NSMutableArray new]; 
[arr1 addObject:@"jack"]; 
NSArray *arr = @[@"jack", @"rose", @"lili"]; 
[arr1 addObjectsFromArray:arr]; 
[arr removeObject:@"lili"];

c. 删除指定范围内的元素
- (void)removeObject:(ObjectType)anObject inRange:(NSRange)range;

NSMutableArray *arr1 = [NSMutableArray new]; 
[arr1 addObject:@"jack"]; 
NSArray *arr = @[@"jack", @"rose", @"lili"]; 
[arr1 addObjectsFromArray:arr]; 
[arr removeObject:@"lili" inRange:NSMakeRange(0, 3)];

d. 删除最后一个元素
- (void)removeLastObject;

NSMutableArray *arr1 = [NSMutableArray new]; 
[arr1 addObject:@"jack"]; 
NSArray *arr = @[@"jack", @"rose", @"lili"]; 
[arr1 addObjectsFromArray:arr]; 
[arr removeLastObject];

e. 删除所有
- (void)removeAllObjects;

NSMutableArray *arr1 = [NSMutableArray new]; 
[arr1 addObject:@"jack"]; 
NSArray *arr = @[@"jack", @"rose", @"lili"]; 
[arr1 addObjectsFromArray:arr]; 
[arr removeAllObjects];

183. NSNumber

无论是NSArray还是NSMutableArray,里面只能存储OC对象。基本数据类型是无法存储的。
解决方案:先用一个OC对象,将基本数据类型包装,再将这个对象放到NSArray中。

NSNumber

1). 作用: 包装基本数据类型.
NSNumber *number = [NSNumber numberWithInt:10];
等价于
NSNumber *number = @10; // 简写方式。
// @10: 代表是1个NSNumber独享,这个对象中包装的是整型的10.

NSLog(@"%d", number.intValue); // 从NSNumber中取值。

注意:如果后面的数据是1个变量,这个变量就必须使用小括号括起来。
int num =10;
NSNumber *number = @(num);



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容