iOS编程中的NSArray和NSMutableArray

  1. 创建不可变 数组、字典、字符串,不管用类方法创建还是对象方法创建,只要是创建空的对象, 发现得到的地址都是一样的,由此可以知道初始化空的对象的时候会生成一个单例
    NSArray *a = [NSArray array];         //0x60000001e3f0 
    NSArray *b = [NSArray array];         //0x60000001e3f0
    NSArray *c = [NSArray array];         //0x60000001e3f0
    NSArray *e = [[NSArray alloc] init];  //0x60000001e3f0
    NSArray *d = [NSArray array];         //0x60000001e3f0
    NSArray *f = [[NSArray alloc] initWithObjects:@"1", nil];//0x60000000f660
    NSArray *g = [[NSArray alloc] initWithObjects:@"1", nil];//0x60000000f600
    NSLog(@"%p-%p-%p-%p-%p-%p-%p",a,b,c,e,d,f,g);
  1. 创建可变 数组、字典、字符串,都会申请不同的内存空间。
   NSMutableString *a = [NSMutableString string];       
   //0x600000244ec0
    NSMutableString *b = [NSMutableString string];        
   //0x600000244b00
    NSMutableString *c = [NSMutableString string];        
   //0x600000244b90
    NSMutableString *d = [NSMutableString string];        
   //0x600000243ed0
    NSMutableString *f = [[NSMutableString alloc] init];  
   //0x6000002431b0
    NSLog(@"%p-%p-%p-%p-%p",a,b,c,d,f);

3.OC数组和c数组的区别

C语言的数组:

相同类型变量的有序结合。 类型:可以是简答数据类型、构造数据类型

int a[10];

int *b[10];

1)NSArray是一个对象,是任意类型对象地址的集合

不能存放简单的数据类型(int, float, NSInteger…)

除非通过一些手段把简单数据类型变成对象。

2)C数组可以保存任意类型的数据

3)NSArray下标越界不会有警告,但是运行会直接报错

2、如何创建一个空数组

  NSArray *array = [[NSArray alloc] init];

  NSArray *array = [NSArray array];

这个两个数组初始化方法的不同,我在一篇简书里面已经说过。

  1. 通过指定对象创建数组
      //只有一个元素
      array = [NSArray arrayWithObject:@"aaa"];
      //有n个元素
      array = [NSArray arrayWithObjects:@"1111",@"2222",@"333", nil];

4.通过指定数组创建数组(两个数组内容的一样)

[NSArray arrayWithArray:数组];

5.通过简单的方式创建数组

array = @[];//空数组

array = @[@"111",@"222",@"333"];//3个元素

6.把数组中所有的元素转化为字符串

[array componentsJoinedByString:@“两个元素之间添加的字符串”];

7.获取数组元素个数

[array count];

8.通过索引获取相应的元素(下标要小于数组的count)

 [array objectAtIndex:下标];

 简单取值:array[下标];

9.通过对象获取在数组中的索引(通过元素获取下标)

 [array indexOfObject:要找的元素];

10.取出数组的最后一个元素或者第一个元素

      //取第一个元素
       [array firstObject];
       //取最后一个
       [array lastObject];

11.判断数组中数组包含某个元素

 [array containsObject:要查找的对象]

12.如何取出数组中的一部分元素

//索引的集合,保存索引的,NSIndexSet是一个集合类(索引的集合),但是集合里面不能有重复索引
//只初始化一个索引

NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:2];


//下标为1,长度为2

NSRange range = NSMakeRange(0, 3);

//构造一个范围的索引

indexSet = [NSIndexSet indexSetWithIndexesInRange:range];

 
[array objectsAtIndexes:indexSet];

13.判断NSArray中存储的对象是否为指定类型的对象

 /*
 [A isKindOfClass:B],判断A类是否是B的子类或者本类。
 [A isMemberOfClass:B],判断A类是否是B类(不包括子类)
*/

14.判断两个数组内容是否相同(与顺序有关)

NSArray *arr1 = @[@"111",@"222",@"333"];

        NSArray *arr2 = @[@"111",@"333",@"222"];

        

        if ([arr1 isEqualToArray:arr2])

        {

            NSLog(@"内容完全相等");

        }

        else

        {

            NSLog(@"内容不完全相等");
}
15.把数组写入文件中(数组里面是NSString,int,float,double......)
 [array writeToFile:path atomically:YES]

16.从文件中读取数组

 [NSArray arrayWithContentsOfFile:path];

17.基本类型的包装类

 NSNumber

//把int类型包装成对象

 numberWithInt

18.截取数组中指定范围的元素

[array subarrayWithRange:要截取的范围];
NSArray数组的遍历

1.通过下标遍历数组

for (int i = 0 ; i < [array count]; i++)

{

       NSLog(@"%@",array[i]);

}

2、NSEnumerator 枚举器

    1)objectEnumerator消息

    作用:正序输出所有元素

       NSEnumerator *enumerator = [array objectEnumerator];

        2)reverseObjectEnumerator消息

    作用:逆序输出所有元素

       enumerator = [array reverseObjectEnumerator];

   //取下一个元素

    [enumerator nextObject]

3.快速枚举法(for in)

for (类型 *变量 in 数组)
NSMutableArray可变数组

1.思考:为什么需要有NSMutableArray

2.NSMutableArray的作用

3.如何创建一个NSMutableArray

 1)创建空数组

           <1>NSMutableArray *array = [[NSMutableArray alloc] init];

<2>array = [NSMutableArray array];

            2)创建有对象的数组

               《1》初始化只能有一个对象

              NSMutableArray arrayWithObject:@"111"];

       《2》初始化只能有多个对象

[NSMutableArray arrayWithObjects:@"1111",@"222",@"333",@"4444", nil];

       [[NSMutableArray alloc] initWithObjects:<#(id), ...#>, nil];

4.可变数组添加元素
  1)向可变数组里面添加元素(在最后添加)

       [array addObject:元素];

        2)如何向可变数组中插入一个元素

         /*

         添加一个元素

         */

//在下标为0的位置添加333

       [array insertObject:@"333" atIndex:0];

         3)如何向可变数组中插入多个元素
/*添加多个元素*/

//要添加的元素

NSArray *insertArray = @[@"444",@"555"];

//要添加的索引

NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, [insertArray count])];

        
/*注意:要添加元素数组的个数等于索引集合的个数,否则crash*/

[array insertObjects:insertArray atIndexes:indexSet];

5.根据数组下标取值

 [array objectAtIndex:下标];

6、如何删除元素

1)删除指定索引的元素

[arr**ay removeObjectAtIndex:****下标****];**

    2) 删除最后一个元素

[array removeLastObject];

    3)根据指定对象来删除元素

[array removeObject:对象];

    4)删除所有元素

[array removeAllObjects];

5)一次性删除所有指定下标的元素

          [array removeObjectsAtIndexes:索引集合];

6) 删除指定范围内的元素

[array removeObjectsInRange:<#(NSRange)#>];

6.替换元素

//根据下标替换元素

[array replaceObjectAtIndex:0 withObject:@"xiaoming"];

//根据下标集合替换元素(多个元素替换)

[array replaceObjectsAtIndexes:<#(NSIndexSet *)#> withObjects:<#(NSArray *)#>];

//当前指定范围的下标替换为指定数组中的元素

[array replaceObjectsInRange:<#(NSRange)#> withObjectsFromArray:<#(NSArray *)#>];

7.交换两个元素

/*下标与下标进行交换*/

 [array exchangeObjectAtIndex:交换的下标 withObjectAtIndex:交换的下标];
数组排序

8、数组排序

 1)数组排序方法

    sortedArrayXXX函数

作用:通过返回值将排序结果告诉用户,{不会修改数组中的元素}

适用于不能修改的数组

    sortUsingXXX函数

      作用:直接对数组内的元素进行排序,{最后结果保存在要排序的数组中}

适用于可被修改的数组

  2)使用block排序

    什么是block:类似于c语言中的函数指针

    block的好处:可以访问函数中的局部变量

    !!!定义一个block语法!!!

    block如何修改函数中的局部变量

__block关键字,是block语法特有的关键字  相当于将变量变成全局变量

 其它说明:

    函数指针是指向函数的指针变量,即本质是一个指针变量。

   int (*f) (int x); /* 声明一个函数指针 */

   f=func; /* 将func函数的首地址赋给指针f */

 指向函数的指针包含了函数的地址,可以通过它来调用函数。声明格式如下:

 类型说明符 (*函数名)(参数)

3) NSSortDescriptor高级排序

其他
selector选择器使用
1.SEL数据类型

  1)什么是

    Objective-C在**SEL**编译的时候,会根据方法的名字(包括参数序列),

    生成一个用 来区分这个方法的唯一的一个ID,这个ID就是SEL类型的

还可以这样理解:

                     SEL就是对方法的一种包装。包装的SEL类型数据它对应相应的方法地址,找到方法地址就可以调用方法。在内存中每个类的方法都存储在类对象中,每个方法都有一个与之对应的SEL类型的数据,根据一个SEL数据就可以找到对应的方法地址,进而调用方法。

**方法的存储位置:**

*   在内存中每个类的方法都存储在类对象中
*   每个方法都有一个与之对应的SEL类型的数据
*   根据一个SEL数据就可以找到对应的方法地址,进而调用方法

  2)作用:

从效率的角度上来说,执行的时候不是通过方法名字而是方法ID也就是一个整数来查找方法,

       由于整数的查找和匹配比字符串要快得多,所以这样可以在某种程度上提高执行的效率

  并且增强程序的灵活性

  3)使用方法

通过@selector方法获取

SEL s1 = @selector(compare:);

通过NSSelectorFromString将一个字符串转换为一个SEL类型

SEL s2 = NSSelectorFromString(@"compare:");

2.performSelector

  1)作用:执行SEL

  2)使用@selector排序

    SEL 是oc特有的类型  compare:   @selector(compare:)

         一个方法名对应一个编号

         只要方法名相同,那么它的SEL值就相同

         ios会将方法名(函数名)转化为一个唯一编号  编号就是SEL类型

         系统通过识别SEL 去寻找对应的方法名

         @selector :方法选择器

         @selector(xxx) xxx就是方法名

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

推荐阅读更多精彩内容