数组和字典相关知识

一、数组与字典都可当做容器,里边可以存放任何对象。只不过,他们存放数据时会有区别:

数组:只需将对象放入,使用addObject:方法

字典,除了要放入对象,还要存入与对象所对应的另一个对象(一般是NSString)作为key,使用setObject:  forKey:方法。寻找对象时,就可以通过key获得。是以键值对的形式存在的。

如果要在数组中存一个空值时,使用空对象[NSNull  null]。注意不能使用nil,因为nil是数组或者字典的结束标记。另外注意区别:nil是一个对象指针为空,Nil是一个类指针为空,NULL是基本数据类型为空。


二、关于setValue: forKey:与setObject: forKey:

1、setValue: forKey:是OC对象的方法

value 为 nil :调用 removeObject:forKey:

value不为nil:调用 setObject:forKey:

其中key为NSString类型。

2 、setObject:forKey:是可变字典的方法

value不能为nil,而且key是一个id类型,不仅限于NSString类型

3、另外,setValue采用的是KVC机制,而setObject不是。

( KVC(Key-Value-Coding)内部的实现:一个对象在调用setValue的时候,(1)首先根据方法名找到运行方法的时候所需要的环境参数。(2)他会从自己isa指针结合环境参数,找到具体的方法实现的接口。(3)再直接查找得来的具体的方法实现。KVO(Key-Value-Observing):当观察者为一个对象的属性进行了注册,被观察对象的isa指针被修改的时候,isa指针就会指向一个中间类,而不是真实的类。所以isa指针其实不需要指向实例对象真实的类。所以我们的程序最好不要依赖于isa指针。在调用类的方法的时候,最好要明确对象实例的类名。)


三、遍历

1、数组遍历

NSArray *array = [NSArray arrayWithObjects:@"1",@"2",@"3",@"4", nil];

//第一种遍历:普通for循环

long int count = [array count];

for (int i = 0 ; i < count; i++) {

NSLog(@"1遍历array: %zi-->%@",i,[array objectAtIndex:i]);

}

//第二种遍历:快速for循环,需要有外变量i

int i = 0;

for (id obj in array) {

NSLog(@"2遍历array:%zi-->%@",i,[array objectAtIndex:i]);

i++;

}

//第三种遍历:OC自带方法enumerateObjectsUsingBlock:

//默认为正序遍历

[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

NSLog(@"3遍历array:%zi-->%@",idx,obj);

}];

//NSEnumerationReverse参数为倒序遍历

[array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

NSLog(@"4倒序遍历array:%zi-->%@",idx,obj);

}];

//第四种遍历:利用枚举

NSEnumerator *en = [array objectEnumerator];

id obj;

int j = 0 ;

while (obj = [en nextObject]) {

NSLog(@"5遍历array:%d-->%@",j,obj);

j++;

}

}

2、字典遍历

//第一种遍历:allValues遍历。NSDictionary函数allValues会返回以数组而非字典形式组织的对象。使用for-each循环遍历字典中的对象,可以通过如下代码实现:

for (NSString *s in [dictionary allValues]) {

NSLog(@"value: %@", s);

}

//第二种:allKeys遍历。NSDictionary函数allKeys会将键值作为数组返回:

for (NSString *s in [dictionary allKeys]) {

NSLog(@"key: %@", s);

}

//第三种:block 遍历。通过enumerateKeysAndObjectsUsingBlock:方法针对字典中的每个对象执行代码。可以用来定义代码块,然后应用到字典中的每个对象,同时又不必创建for-each循环或是获得数组版本的字典引用:

[dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {

NSLog(@"key = %@ and obj = %@", key, obj);

}];

其中对于数组来说,for-in方式遍历速度是最快的,普通风格的for和block方式速度差不多。对于字典来说,allValues方式遍历最快,allKeys和block差不多。

推荐阅读更多精彩内容