OC之NSArray/NSMutableArrray

Objective-C中除了可以使用C中的基本数组外,如int[5],char word[] ={‘a’,’b’,’c’};Foundation还提供了NSArray类,其有如下特点:。

(1)NSArray是有序的对象集合。

(2)NSArray保存的对象可以是不同的对象。

(3)int ,char,double等基本数据类型不能直接保存,需要通过转换成对象才能加入数组。

例如下面的代码在运行时会报错:

NSArray *arrs = [[NSArray alloc]initWithObjects:@”abc”,@”123”,456,nil];

就像NSString和NSMutableString一样,同样也存在可变数组和不可变数组.不可变数组是由NSArray类处理的,而可变数组则是由NSMutableArrray处理的.后者是前者的子类,也就是说NSMutableArrray继承了NSArray的方法.

NSArray 不可变数组

使用NSArray关键字创建一个不可变的数组,一旦初始化完毕后这个数组的元素是不可以在动态的添加与删除。例如:

int main(int argc, const char * argv[])

{

    @autoreleasepool {

 

        //创建一个包含星期的数组

        NSArray *days = [NSArray arrayWithObjects:@"SUN",

@"MON",@"TUE",@"WED",@"THU",@"FRI",@"SAT", nil];

 

        //获取数组所包含对象个数

        NSLog(@"size of days:%ld",(unsigned long)[days count]);  //size of days:7

 

        //循环打印数组中的元素,比较普遍,但效率不高

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

            NSLog(@"%@",[days objectAtIndex:i]);

        }

 

        //另一种方法打印数组中的元素,效率高,推荐使用

        for(id day in days){

            NSLog(@"%@",day);

        }

    }

    return 0;

}

对于数组创建,编译器为了减少代码量,提供了更简便方法,比如:

NSArray *days = [NSArray arrayWithObjects:@"SUN",

@"MON",@"TUE",@"WED",@"THU",@"FRI",@"SAT", nil];

等价于:

NSArray *days =

@[@"SUN","MON","TUE","WED","THU","FRI","SAT"];

创建多维NSArray:

NSArray *days = @{

@{@”sum,@”mon”,@”tue”,@”wed”},

@{@”sum,@”mon”,@”tue”,@”fri”}

@{@”fri,@”mon”,@”tue”,@”sat”}

@{@”sat,@”mon”,@”tue”,@”wed”}

}

NSArray的类方法arrayWithObjects:使用一列对象作为元素创建数组,这种情况下需要按顺序列出对象并使用逗号隔开。将这个数组的最后一个值指定为nil,标记参数数组的结束.它实际上并不会存储在数组中.

[array count] : 得到这个数组对象的长度。

[array objectAtIndex index]: 传入数组的索引(index) 得到数据对象。

[arrayWithObjects: …] :向数组对象初始化赋值。这里可以写任意对象的指针,结尾必须使用nil,以标志结束.

+(id)arrayWithObjects:obj1,obj2,…nil 创建一个新的数组,obj1,obj2……是他的元素对象,以nil对象结尾

-(BOOL)containsObject:obj 确定数组中是否包含对象obj

-(NSUInteger)count 返回数组元素个数

-(NSUInteger)indexOfObject:obj 第一个包含obj元素的索引号

-(id)objectAtIndex;i 返回存储在位置 i 的对象

-(void)makeObjectsPerformSelector:(SEL)selector 将 selector 只是的消息发送给数组中的每个元素

-(NSArray*)sortedArrayUsingSelector:(SEL)selector 根据selector 指示的比较方法对数组进行排序,比如:

NSArray * array = @[@"b",@"d",@"a",@"z"];

array = [array sortedArrayUsingSelector:@selector(compare:)];

NSLog(@"排序后 array %@",array);

 

-(BOOL)writeToFile:path atomically:(BOOL)flag 将数组写入指定的文件中,如果flag 为 YES,则需要先创建一个临时文件

MSMutableArray可变数组

大多时候我们需要动态的增加和删除数组中的元素,这就需要使用MSMutableArray。例如:

int main(int argc, const char * argv[])

{

 

    @autoreleasepool {

       //创建一个空数组

       NSMutableArray *arrs = [NSMutableArray array];

 

        //C中的一些基本元素我们可以用NSNumber类来包装,类似java中的装箱,另外还有一些struct类型的数据我们也可以用NSNumber类的父类NSValue来进行包装,包装成NSValue的对象再将其放入数组中。

        int age=23;

        char c='a';

        float f=3.1415926;

        NSRect rect =NSMakeRect(1, 2, 3, 4);

 

        NSNumber *objAge = [NSNumber numberWithInt:age];

        NSNumber *objC =[NSNumber numberWithChar:c];

        NSNumber *objF =[NSNumber numberWithFloat:f];

        NSValue *objRect = [NSValue valueWithRect:rect];

 

        [arrs addObject:objAge];

        [arrs addObject:objC];

        [arrs addObject:objF];

        [arrs addObject:objRect];

 

        //如果要添加空的话可以用以下方法

        [arrs addObject:[NSNull null]];

 

        NSLog(@"Size of arrs: %li",(unsigned long)[arrs count]); //Size of arrs: 5

        NSLog(@"%@",arrs);

 

        //创建一个指定初始容量的数组

        NSMutableArray *arrs2 =

[NSMutableArray arrayWithCapacity:3];

 

        //指定初始容量为3,但我们添加了5个对象

        [arrs2 addObject:@"obj1"];

        [arrs2 addObject:@"obj2"];

        [arrs2 addObject:@"obj3"];

        [arrs2 addObject:@"obj4"];

        [arrs2 addObject:@"obj5"];

 

        //将对象 obj 插入到索引为 i 的位置

        [arrs2 insertObject:@"obj" atIndex:0];

 

        //删除指定索引处的对象

        [arrs2 removeObjectAtIndex:3];

 

        //遍历数组

        for(id obj in arrs2){

            NSLog(@"%@",obj);    //obj,obj1,obj2,obj4,obj5

        }

 

        //合并字符串数组

        NSString *str = [arrs2 componentsJoinedByString:@"|"];

        NSLog(@"%@",str);  //obj|obj1|obj2|obj4|obj5

 

        //字符串切割成数组

        NSArray *arr3=[str componentsSeparatedByString:@"|"];

        NSLog(@"%@",arr3);

 

    }

    return 0;

}

 

NSMutableArray类常用方法

array 创建一个空数组

+(id)arrayWithCapacity:size 创建一个数组,指定容量为size

-(id)initWithCapacity:size 初始化一个新分配的数组,指定容量为size

-(void)addObject:obj 将对象obj添加到数组末尾

-(void)insertObject:obj atIndex:i 将对象 obj 插入到索引为 i 的位置

-(void)replaceObject:obj atIndex:i 将数组中索引为 i 处的元素用obj 置换

-(void)removeObject:obj 从数组中删除所有是 obj 的对象

-(void)removeObjectAtIndex:i 从数组中删除索引为 i 的对像

-(void)sortUsingSelector:(SEL)selector 用 selector 只是的比较方法将数组排序

时间: 2024-09-15 04:36:44

OC之NSArray/NSMutableArrray的相关文章

iOS - OC NSArray 数组

前言 @interface NSArray<__covariant ObjectType> : NSObject <NSCopying, NSMutableCopying, NSSecureCoding, NSFastEnumeration> @interface NSMutableArray<ObjectType> : NSArray<ObjectType> 数组只能存储 OC 对象,不能存储 C 语言中的基本数据类型,也不能存储 nil . Xcode

WKWebView与Js实战(OC版)

前言 上一篇专门讲解了WKWebView相关的所有类.代理的所有API.那么本篇讲些什么呢?当然是实战了! 本篇文章教大家如何使用WKWebView去实现常用的一些API操作.当然,也会有如何与JS交互的实战. 如果还没有阅读过WKWebView精讲(OC版),请先阅读,不然有可能看不懂下面所讲的内容. 效果图 通过本篇文章,至少可以学习到: OC如何给JS注入对象及JS如何给IOS发送数据 JS调用alert.confirm.prompt时,不采用JS原生提示,而是使用iOS原生来实现 如何监

WKWebView API精讲(OC)

前言 鉴于LL同志对笔者说:"能不能写个OC版本的WKWebView的使用教程?",还积极打赏了30RMB,笔者又怎么好意思拒绝呢,于是才有了下文. 所有看到本篇文章的同志们,应该要感谢LL同志,更要向LL同志学习,积极打赏! WKWebView 看看WKWebView的头文件声明: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37

OC——第五天NSSArray&amp;nbsp;/NSDicti…

1.oc中常用的集合(容器)有: 1.NSArry 数组:2.NSDicitionary 字典:3.NSSet 集(不常用)     数组:NSArry 继承自NSObject ,不可变的数组,用于管理一系列对象的一个有序的集合:注意:数组中只能存放对象类型,虽然数组中存储的内容不能修改,但是数组指针是可以重指向的;   ============================================== 总结:NSArray NSDictionary NSSet     1. NSAr

OC语言大总结(下)

根据OC学习的知识点,总结了一下,希望能帮到大家! 作者:韩俊强   未经允许,请勿转载! 关注博主:http://weibo.com/hanjunqiang 上接:http://blog.sina.com.cn/s/blog_814ecfa90102vuu1.html 第五节 数组.字典.集合 字典.集合:http://blog.sina.com.cn/s/blog_814ecfa90102vub9.html 数组:http://blog.sina.com.cn/s/blog_814ecfa9

OC面试题[搜集]

浅复制和深复制的区别?//浅拷贝和深拷贝 答案:浅层复制(copy):只复制指向对象的指针,而不复制引用对象本身.//通过对象的指针来访问这个对象 深层复制(mutableCopy):复制引用对象本身 意思就是有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象本身资源 还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一个思想.深复制就好理解了,内存中存

OC学习之道:关于Block的初级学习

转自:http://blog.csdn.net/qq_31810357 [objc] view plaincopy "code" class="OC">      //   //  main.m   //  Copyright (c) 2015年 tongxing. All rights reserved.   //      #import    #import "Student.h"   typedef int(^BlockType)(

Google Palette算法详解以及OC化

1.背景 在发现百日大战时景项目中.有一个创新玩法,就是通过筛选图片主色调来显示如红色系,蓝色系照片.这就涉及到了图片主色调的提取.技术选型为客户端进行图片颜色提取,上传到服务端.但是由于项目时间限制,iOS和Android的图片色调提取算法不一样.Android采用的是Google官方推出的Palette算法,为了统一,在这一期我去研究了一下Palette算法,并将它OC化.最终将作为一个两端统一的技术方案,提供SDK到海纳平台上. 2.Google Palette算法简介 Palette算法

OC 自动生成分类属性方法

分类属性方法自动生成编码全过程. 背景 分类,在 iOS 开发中,是常常需要用到的.在分类里添加属性也是常有的事,但分类中无法添加实例变量,编译器也无法为提供分类中属性的 getter 和 setter 方法了.一般而言,需要手动来实现这两个方法,如果只是用来存储变量的话,关联对象很容易做到这一点: @interface NSObject (db_sqlite) @property (nonatomic, assign) int db_rowid; @end @implementation NS