一、数组与字典都可当做容器,里边可以存放任何对象。只不过,他们存放数据时会有区别:
数组:只需将对象放入,使用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差不多。