数组是一个有序的集合,OC中的数组只能存储对象类型, 但是对于对象的类型没有限制。
通过下标访问数组元素,下标从0开始。
NSAa:不可变数组,即:对象创建好以后,数组中元素个数不能发⽣生变化。
初始化⽅方法
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);
注: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 : NSObject 4 5 @property NSString *name; 6 @property NSInteger item; 7 8 @end

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

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 }
大家可以自己看下测试结果
结论就是:1.自定义类在格式化字符串中会调用自己的description方法(其实系统类也是,系统类也是重写了这个方法,包括NSString类)。
2.在indexOfObject和removeObject等需要判断两个对象是否相等的方法中,会调用继承自NSObject的isEqual方法(此方法建议重写)。
下面会详细讨论下数组的排序