1,c数组
因为objective-c语言是在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:
object1, object2, object3, nil];
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];
遍历:
// 第一种方法
1,for (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;
}
原文来自:菠萝心