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 : NSObject
4 
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方法(此方法建议重写)。

 

 下面会详细讨论下数组的排序

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2015-12-24 09:20  小红烧  阅读(2994)  评论(0编辑  收藏  举报