NSArray

NSArray

1、创建数组:

NSArray *array = [NSArray array];    //通过array 这个静态方法可以快速创建一个空的数组。

array = [NSArray arrayWithObject:@"123"];    //arrayWithObject: 静态方法 创建有1个元素的数组。

array = [NSArray arrayWithObjects:@"a", @"b", @"c", nil];
//arrayWithObjects: 静态方法 创建有多个元素的数组。

int count = [array count]; 
//等价于: count = array.count; count方法用于获得数组元素个数。

2、数组的简单使用:

NSObject *obj = [[NSObject alloc] init];

NSArray *array = [NSArray arrayWithObjects:@"a", @"b", @"c" , obj, nil];
//任何OC对象都可以放入OC数组中,如:obj。

if ([array containsObject:@"a"]) {
//containsObject: 方法用于判断array数组中是否包含了元素@"a",返回值为BOOL类型。
     NSLog(@"包含了字符串a");
} 

NSString *last = [array lastObject];    
//lastObject 方法用于取出数组array中最后一个元素。

NSString *str = [array objectAtIndex:1];    
//objectAtIndex: 方法用于取出数组中索引所对应的元素。

int index = [array indexOfObject:@"c"];    
//indexOfObject: 方法用于得到数组中元素@"c"所对应的索引值(脚标)。

-(NSUInteger)indexOfObject(id)anObject inRange:(NSRange)range 
//这个方法是在range范围内查找指定元素的位置。

-(BOOL)isEqualToArray(NSArray *)otherArray 
//这个方法用来比较两个集合内容是否相同。

-(id)firstObjectCommonWithArray(NSArray *)otherArray 
//这个方法用来返回两个集合中第一个相同的对象元素。

3、数组的内存管理:

Student *stu1 = [[Student alloc] init];
Student *stu2 = [[Student alloc] init];
Student *stu3 = [[Student alloc] init];

NSLog(@"stu1:%zi", [stu1 retainCount]);
//retainCount 方法用来获得stu1这个对象的内存计数器的值。

NSArray *array = [[NSArray alloc] initWithObjects:stu1, stu2, stu3, nil]; //initWithObjects: 方法用来把对象stu1, stu2, stu3塞进数组中,当把一个对象塞进数组中时,这个对象的计数器会加1,也就是说数组会对它做一次retain操作。

[stu1 release];
[stu2 release];
[stu3 release];
[array release]; // 数组被销毁的时候,会对内部的所有元素都做一次release操作。

4、给数组里面的元素发送消息:

Student *stu1 = [[Student alloc] init];
Student *stu2 = [[Student alloc] init];
Student *stu3 = [[Student alloc] init];

NSArray *array = [NSArray arrayWithObjects:stu1, stu2, stu3, nil];
//arrayWithObjects: 方法用来把对象stu1, stu2, stu3塞进数组中。

[array makeObjectsPerformSelector:@selector(test)];
//makeObjectsPerformSelector:@selector() 方法让数组array里面的所有对象都调用test方法。

[array makeObjectsPerformSelector:@selector(test2:) withObject:@"123"];
//makeObjectsPerformSelector:@selector()withObject: 方法让数组array里面的所有对象都调用test2:方法并传递一个参数@"123";此方法只支持传一个参数;注:test2:是有有参数的方法。

5、遍历数组:

NSArray *array = [NSArray arrayWithObjects: @"1", @"2", @"3", nil];
int count = array.count;//这样写可以让代码效率更高,count方法可以只调用一次。
for (int i = 0; i<count; i++) 
{
    // id类型 等价与 void *
    id obj = [array objectAtIndex:i];

    NSLog(@"%i-%@", i, obj);
}

//快速遍历:for-in 语法
NSArray *array = [NSArray arrayWithObjects: @"1", @"2", @"3", nil];
int i =0;
for (id obj in array) 
{ //快速遍历,把array中的元素遍历一遍赋值给obj。

    NSLog(@"%i-%@", i, obj);//i作为array中的角标。
    i++;
}

//使用Block遍历数组(系统推荐使用):
NSArray *array = [NSArray arrayWithObjects: @"1", @"2", @"3", nil];
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) 
{ NSLog(
@"%i-%@", idx, obj); //enumerateObjectsUsingBlock: 方法是使用Block方式遍历一个数组array,每遍历到一个数组中的元素就会调用一次Block;obj、idx、*stop为三个参数,obj为当前遍历的数组中元素、idx为当前遍历数组中的元素索引、*stop为是否继续遍历数组的条件判断,当*stop = YES;时遍历停止。 if (idx == 1) {// 如果索引为1,就停止遍历 *stop = YES; // 利用指针修改外面BOOL变量的值 } }]; //通过迭代器遍历数组: NSArray *array = [NSArray arrayWithObjects: @"1", @"2", @"3", nil]; NSEnumerator *enumerator = [array objectEnumerator]; //获取数组的迭代器 NSEnumerator *enumerator = [array reverseObjectEnumerator]; //获取数组的反序迭代器(从尾部开始遍历元素) NSArray *array2 = [enumerator allObjects]; // allObjects 方法是只能取出没有被遍历过的元素对象。 NSLog(@"array2:%@", array2); id obj = nil; while (obj = [enumerator nextObject]) { //nextObject 方法用于获取下一个需要遍历的元素。 NSLog(@"obj=%@", obj); }

6、派生出新的数组:

NSArray *array = [NSArray arrayWithObjects:@"1", @"2", nil];
NSArray *array2 = [array arrayByAddingObject:@"3"];
//arrayByAddingObject: 方法用于在原来的数组array基础上添加新的对象(元素)生成一个新的数组array2。

NSArray *array3 = [array arrayByAddingObjectsFromArray:[NSArray arrayWithObjects:@"4", @"5", nil]];
//arrayByAddingObjectsFromArray: 方法 用于在原来数组array基础上添加一个新的数组[NSArray arrayWithObjects:@"4", @"5", nil]后生成一个新数组array3。

NSArray *array4 = [NSArray arrayWithObjects:@"1", @"2", @"3", @"4", nil];
NSRange range = NSMakeRange(1, 2);
NSArray *array5 = [array4 subarrayWithRange:range];
//subarrayWithRange: 方法按照指定范围range来截取数组array4中的元素形成新的数组。
NSLog(@"array5:%@", array5);

//注:array、array2、array3、array4、array5 五个数组皆为不可变数组,前后并没有变化仍是原来的数组。

7、数组的其他用法:

NSArray *array = [NSArray arrayWithObjects:@"1", @"2", @"3", @"4", nil];
NSString *str = [array componentsJoinedByString:@"-"];
//componentsJoinedByString: 方法 是利用分隔符-拼接数组array中所有的元素形成字符串@”1-2-3-4”。   

NSString *path = @"/Users/apple/Desktop/array.xml";//字符串的形式指定一个路径。
[array writeToFile:path atomically:YES];//writeToFile:(NSString *) atomically:(BOOL) 方法是将一个数组array按照路径path写入文件(生成的是一个xml文件),atomically:YES代表要进行原子性操作。

path = @"/Users/apple/Desktop/array.txt";
NSArray *array2 = [NSArray arrayWithContentsOfFile:path];
//arrayWithContentsOfFile: 方法是从指定路径path文件中(文件有严格的格式要求XML格式)读取内容形成一个数组。

NSMutableArray

NSMutableArray *array = [NSMutableArray arrayWithObject:@"1"];//NSMutableArray 动态数组类型。
[array addObject:@"2"];// 添加元素
[array addObject:@"3"];

[array removeObject:@"2"];//removeObject: 方法用于移除数组array中指定的元素@"2"。
[array removeLastObject];//removeLastObject 方法用于移除数组array中最后一个元素。
[array removeAllObjects];//removeAllObjects 方法用于移除数组array中的所有元素。

NSMutableArray *models = [NSMutableArray arrayWithCapacity:20]; 
// arrayWithCapacity 方法用于给数组分配容量。

-(void)setArray:(NSArray *)otherArray     //设置集合元素。
-(void)addObjectsFromArray:(NSArray *)otherArray    //添加otherArray数组的全部元素到集合中。

-(void)insertObject:(id)anObject atIndex:(NSUInteger)index    //在index位置插入一个元素。
-(void)insertObjects:(NSArray *)objects atIndexes:(NSIndexSet *)indexes    //在indexes指定的位置分别插入objects数组中的元素。

-(void)removeObjectAtIndex:(NSUInteger)index    //删除index位置的元素。
-(void)removeObjectsAtIndexes:(NSIndexSet *)indexes    //删除indexes位置的所有元素。
-(void)removeObject:(id)anObject inRange:(NSRange)range    //在range范围内查找特定的元素进行删除。
-(void)removeObjectsInArray:(NSArray *)otherArray    //删除同时存在于otherArray和当前集合中的所有元素。
-(void)removeObjectsInRange:(NSRange)range    //删除range范围内的所有元素。

-(void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject    //用anObject替换index位置对应的元素。
-(void)replaceObjectsAtIndexes:(NSIndexSet *)indexes withObjects:(NSArray *)objects //用objects数组中的元素分别替换indexes对应位置的元素。

-(void)replaceObjectsInRange:(NSRange)range withObjectsFromArray:(NSArray *)otherArray range:(NSRange)otherRange
//用otherArray数组中otherRange范围内的元素替换当前集合range范围内的元素。

-(void)replaceObjectsInRange:(NSRange)range withObjectsFromArray:(NSArray *)otherArray    //用otherArray数组中的元素替换当前集合range范围内的元素。

-(void)exchangeObjectAtIndex:(NSUInteger)idx1 withObjectAtIndex:(NSUInteger)idx2    //交换idx1和idx2位置的元素。

//下面三个排序方法的用法参考NSArray的排序。
-(void)sortUsingDescriptors:(NSArray *)sortDescriptors;
-(void)sortUsingComparator:(NSComparator)cmptr;
-(void)sortUsingSelector:(SEL)comparator;
//例下:
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"1", @"3", @"2", nil];
[array sortUsingSelector:@selector(compare:)];    
NSLog(@"%@", array);

   注:OC中数组和字典只能存储OC对象不能存放基本数据类型。

 

原文地址:https://www.cnblogs.com/CJDog/p/5125116.html