你的位置:首页 > 操作系统

[操作系统]OC中数组类NSArray的详解


数组是一个有序的集合,OC中的数组只能存储对象类型, 但是对于对象的类型没有限制。

通过下标访问数组元素,下标从0开始。 





NSA􏰀􏰀a􏰁:不可变数组,即:对象创建好以后,数组中元素个数不能发⽣生变化。 

初始化⽅方法 

NSArray *names = [[NSArray alloc]initWithObjects:@"frank", @"duck", "monkey",nil];

注:nil作为数组存放元素的结束标志(nil在@"frank"后面时,代表数组中只有一个元素,虽然后面还有@"duck", "monkey"),多个元素通过逗号间隔。

便利构造器 

NSArray *names = [NSArrayarrayWithObjects:@"frank", @"duck", @"monkey",nil];

注:和初始化方法相同的注意点

字面量赋初值:使用“ @[] ”,“ [] ”中存入对应的对象,对象之间使用”,”相隔。比如: 





NSArray *names = @[@"frank", @"duck", @"monkey", @"cow"];


NSArray常用方法和属性

元素个数 :

@property (readonly) NSUInteger count;

获取数组中指定下标对应的元素
- (id)objectAtIndex:(NSUInteger)index;

字面量方式获取元素:数组对象[元素下标] 

names[0]

用来判断数组中是否包含某一个给定的对象




- (BOOL)containsObject:(id)anObject;

获取数组元素对应的索引 

- (NSUInteger)indexOfObject:(id)anObject;

将数组中的元素按照给定的字符串格式拼接成一个完整的字符串
// - (NSString *)componentsJoinedByString: (NSString *)separator;//例:有一个数组,通过&将所有元素拼接成一个字符串NSArray *array = @[@"北京", @"大连", @"河南", @"上海", @"广州", @"⻄安"];NSString *string = [array componentsJoinedByString:@"&"]; NSLog(@"%@", string);

View Code

注:NSString类相应的有componentsSeparatedByString:方法把字符串分离成数组。

 

数组类相关注意点:

1.数组中所有元素不能是基本数据类型,否则会编译报错,如果有需要封装成NSNumber类或NSValue类。

2.数组在NSLog中可以作为对象直接输出,此时建议重写NSObject的-(NSString *)description方法(下面会给出具体代码)

3.数组中可以存储自定义类的对象,此时建议重写NSObject的-(BOOL)isEqual:(id)object方法,原因在代码后面讲

1 #import <Foundation/Foundation.h>2 3 @interface Father : NSObject4 5 @property NSString *name;6 @property NSInteger item;7 8 @end

Father类接口
 1 @implementation Father 2  3 -(NSString *)description{ 4   return [NSString stringWithFormat:@"value = %ld",_item]; 5 } 6 -(BOOL)isEqual:(id)object{ 7   if(object == self) 8     return YES; 9   if (!object) {10     return NO;11   }12   if (![object isKindOfClass:[self class]]) {13     return NO;14   }15   16   return [self isEqualToFather:object];17 }18 19 - (BOOL)isEqualToFather:(Father *)aFather {20   if (self == aFather)21     return YES;22   if (!([self item] == [aFather item]))23     return NO;24   return YES; 25 }26 27 28 @end

Father类实现

 

 1 int main(int argc, const char * argv[]) { 2   @autoreleasepool { 3     Father *f1 = [[Father alloc]init]; 4     f1.item = 10; 5     f1.name = @"name"; 6      7     Father *f2 = [[Father alloc]init]; 8     f2.item = 10; 9     f2.name = @"name";10     11     Father *f3 = [[Father alloc]init];12     f3.item = 10;13     f3.name = @"name";14     15     sun *s = [[sun alloc] init];16     s.item = 10;17     s.name = @"name";18     19     NSMutableArray *arr = [NSMutableArray arrayWithObjects:f1,f2,f1,@"test", nil];20     NSLog(@"%ld",[arr indexOfObject:s]);21     22     [arr removeObject:f3];23     NSLog(@"%@",arr);24     25   }26   return 0;27 }

main函数测试代码

大家可以自己看下测试结果

结论就是:1.自定义类在格式化字符串中会调用自己的description方法(其实系统类也是,系统类也是重写了这个方法,包括NSString类)。

             2.在indexOfObject和removeObject等需要判断两个对象是否相等的方法中,会调用继承自NSObject的isEqual方法(此方法建议重写)。