objective-c数组

Posted 菠萝心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了objective-c数组相关的知识,希望对你有一定的参考价值。

内容采用objective-c(下面简称obj)语言。


1,c数组


因为obj是在c语言的基础上建立的,在obj中使用c数组是完全没问题的。


定义:

int a[10]; // 定义了10个元素的整形数组

float b[10]; // 定义了10个元素的浮点型数组


注意:

以下定义是正确的:

#define NUM 5

int a[3+NUM];

int b[2+1];

以下定义是错误的:(不能使用变量表示元素个数)

int n = 5;

int a[n];


c数组本质上就是指针。




在obj中,数组有两种方法:NSArray和NSMutableArray


2,NSArray


这是一个不可变数组,不可变指的是

  • 内容不可变(无法修改元素)

  • 长度不可变(无法插入,删除元素)


定义

  • 使用实例方法创建数组对象:

// 注意最后一个元素是nil

NSArray *array1 = [[NSArray alloc]initWithObjects:

@"one",@"two",[NSNumbernumberWithInt:3], @"four", nil];

// 没有尾巴nil

NSArray *array2 = [[NSArray alloc]initWithObjects:

array1];


  • 使用类方法创建数组对象:

// 需要带着尾巴nil

NSArray *array4 = [NSArray arrayWithObjects:

@"one", @"two", @"three", nil];


  • 使用c数组创建数组对象:

    其中arrayWithObjects后要带c类型的数组对象

NSString *strings[3];

strings[0] = @"First";

strings[1] = @"Second";

strings[2] = @"Third";

// arrayWithObjects后需要一个c类型的数组对象

NSArray *array = [NSArray arrayWithObjects:

strings count:2];

// strings array contains { @"First", @"Second" }


  • 直接快速创建数组对象【推荐方法】:

// 不需要尾巴nil,这种方法也是最推荐的写法

NSArray *array5 = @[@"one", @"two", @"three", @"four"];


《编写高质量ios与OS X代码的52个有效方法》提及【语法糖】:多用字面量语法,少用与之等价的方法

所以创建数组用:

NSArray *array = @[@"one", @"two", @"three"];


这样的好处显而易见:简明扼要,好理解,而且不用专门添加尾巴的空对象nil。

这里截取该书中的一段代码:

id object1 = ...;

id object2 = ...;

id object3 = ...;

// 用arrayWithObject方法创建数组

NSArray *array1 = [NSArray arrayWithObjects:

object1object2object3nil];

NSArray *array2 = @[object1, object2, object3];


假设object2 = nil;

对于第一种创建方法:array1会依次处理各个参数,直到发现nil为止。

由于object2是nil,array1会提前结束,即只包含变量object1,但是程序编译时并不会提示,然后在运行时,就会抛出异常。

而第二种创建方法:array2直接抛出异常。

所以:使用字面量语法(语法糖)更为安全。


下面介绍其他方法:


根据下标获取元素:

NSArray *array;

id object1 = [array objectAtIndex:0];

id object2 = array[0];


同理:建议采用字面量语法,使用第二种取值方法,通过下标来取值。


获取第一个和最后一个元素

NSString *first=[array firstObject];

NSString *last=[array lastObject]; 


根据元素获取下标:

NSInteger index=[array indexOfObject:

@"three"]; // 结果为:2


判断数组中是否存在某个元素:(containObject)

if (array containObject:@"three")

{

    NSLog(@"contains");

}


获取数组某个范围的数据:(subarrayWithRange)

NSArray *array1 = @[@1,@2,@3,@4];

// 第一个参数是位置,第二个是个数

NSRang range =NSMakeRange(1, 2);

NSArray *array2 = 

[array1 subarrayWithRange:range];


遍历:

// 第一种方法

1for (int i = 0; i < array.count; i++)

// 第二种方法

2,NSEnumerator *enumerator = 

[array objectEnumerator];

id ob;

while (ob = [enumerator nextObject])

{

}

// 第三种方法

3,for (id a in array)

应注意在NSArray遍历的过程中,无法修改array的数据


还有其他方法,比如componentsJoinedByString等等。


3,NSMutableArray


这是一个可变数组:

  • 父类是NSArray(所以NSArray拥有的属性NSMutableArray也有)

  • 可以对元素进行修改:增加,删除,修改


定义:

  • 使用initWithObject

NSMutableArray *array = [NSMutableArray alloc]

initWithObjects:@1,@2,nil]; // 同NSArray的用法


  • 使用initWithCapacity

NSMutableArray *array = [NSMutableArray alloc]

initWithCapacity:0]; // 后面的数字是元素的个数

如果你知道需要多少容量,那么就使用initWithCapacity:n来设置

这样的好处是:添加元素时,不需要重新分配内容。


  • 你也什么都不做可以直接初始化

NSMutableArray *array = [NSMutableArray alloc] init]; 

array = [@[@1, @2, @3,] mutableCopy];

// 通过语法糖进行初始化

// 需要加mutableCopy方法

同上,这也是推荐的初始化做法:使用语法糖初始化

使用字面量语法创建出来的字符串,数组,字典对象都是不可变的

所以要可变版本,需要复制一份,因此使用mutableCopy方法

这么做的代价是多调用一个方法,还要再创建一个对象

但是字面量语法带来的好处却远远大于上述的缺点


下面介绍其他方法


增加元素:

[array addObject:object1];


插入元素:

[array insertObject:object1 atIndex:0]:

// 在某个位置插入元素


删除:

// 看名字就知道怎么回事了

[array removeObject:object1];

// 删除最后一个元素

[array removeLastObject];

// 删除范围之内的元素

[array removeObject:object1 

inRange:NSMakeRange(0, 2)];

// 删除所有元素

[array removeAllObjects];


替换和交换:

// 替换某个位置的元素

[array replaceObjectAtIndex:0 

withObject:object1];

// 交换位置

[array exchangeObjectAtIndex:0 

withObjectAtIndex:2];


两个数组的用法大致如上。


如何创建一个有5个元素的float数组?


  • 利用NSNumber:

// NSNumber:是一个用来装基础类型的对象,

可以把整形,单精度,双精度,字符型等基础类型存储为对象

NSNumber *intNum = [[NSNumber alloc] 

initWithInt:1];

NSNumber *floatNum = [[NSNumber alloc] 

initWithInt:1.1f];

NSNumber *doubleNum = [[NSNumber alloc] 

initWithInt:2.2f];

NSNumber *charNum = [[NSNumber alloc] 

initWithInt:'A'];

// 使用NSNumber存储基础类型

NSNumber *float1 = [[NSNumber alloc] 

initWithFloat:1.1f];

NSNumber *float2 = [[NSNumber alloc] 

initWithFloat:2.2f];

NSNumber *float3 = [[NSNumber alloc] 

initWithFloat:3.3f];

NSNumber *float4 = [[NSNumber alloc] 

initWithFloat:4.4f];

NSNumber *float5 = [[NSNumber alloc] 

initWithFloat:5.5f];

// 使用语法糖初始化

NSArray array = [@[float1, float2, float3

float4, float5]];

// 使用时

NSLog(@"%d", [intNum intValue]);

NSLog(@"%f", [array[0] floatValue]);


  • 使用c数组来初始化:

float a[5];

for (int i = 0; i < 5; i++)

{

    a[i] = i;

}


以上是关于objective-c数组的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C:有选择地组合两个数组

带数组的 TableView (Objective-C)

objective-c数组

如何在 Objective-C 中打印单个数组元素?

使用 Objective-C 对 int 数组进行排序 - 优化

在objective-c中检索JSON数组的最基本方法是啥? [复制]