您的位置:首页 > 移动开发 > Objective-C

NSArray与NSMutableArray的区别 NSDictionary以及NSMutableDictionary用法总结

2012-05-29 10:29 555 查看
 


NSArray与NSMutableArray的区别

分类: iOS2012-03-26
16:15 475人阅读 评论(0) 收藏 举报

在iOS 开发过程中, NSArray,NSMutableArray、NSDictionary、 NSMutableDictionary 经常被用到。这里先来介绍NSArray  与 NSMutableArray。 
  NSArray 和 NSMutableArray  二者有时可任意选用,有时又必区分开来。

首先,NSArray只能存储Objective-C 对象,而不能存储C语言中的基本数据类型,比如:int,flot,指针等。 在使用NSArray时,需特别注意,必须以nil 结尾,以此来代表结束。 

举例如下:

 NSArray 通过类方法 arrayWithObjects 创建一个新的NSArray。

NSArray * array;

array = [ NSArray arraryWithObjects: @"one", @"two", @"three",nil     ] ;

为了查看array 的内容, 可通过NSLog方法,如下:

for(int i=0; i<[array count]; i++ )

{

NSLog (@"index %d has %@", i, [array objectAtIndex:i]);

}

从中可看出,NSArray 创建的是静态数组,一旦创建之后,就再也不能添加和删除数组中的对象了。

NSMutableArray 是 NSArray 补充类。NSMutalbeArray 创建的是动态数组,可随意添加或删除数组中的元素。

也行你会看到 arrayWithCapacity 方法,这个数组容量仅仅是一个参考,不会真的限制数组的大小。 是为代码优化而设计的。

NSMutableArray 使用addObject: 在末尾添加对象, 用 removeObjectAtIndex: 来删除指定索引处的对象。对象删除后,被删除对象后面的数组元素被迁移,填补空缺。

这里给出一个实例:

#import <Foundation/Foundation.h>

int main( )

{

NSArray *array = [[NSArray alloc]

initWithObjects: @”red”, @"white”,

@"blue”, nil];

printf(“Array has been created.”);

return 0;

}

 这里需特别注意的是:NSArray 的初始化必须以 nil 结束。

另外还需注意,在字符串前加 @ ,这是 数组在 Objective-C  与 C 的区别。

 如何访问获取 NSArray 中的对象呢?  通过 NSArray的objectAtIndex: 方法。 改写如下:    

#import <Foundation/Foundation.h>

int main( )

{

NSArray *array = [[NSArray alloc]

initWithObjects: @”red”, @”white”,

@”blue”, nil];

printf(“array[0] = %s”, [[array objectAtIndex: 0] cString]);

return 0;

}

输出结果:   array[0] = red.

同理,通过 NSArray的 insertObjectAtIndex: 可以很方便地将已有的对象插入数组中的指定位置。

NSDictionary和NSMutableDictionary

//NSDictionary 初始化
NSDictionary *d1 = [NSDictionary dictionaryWithObjectsAndKeys:@"Shanghai", @"Location", @"Programmer", @"Occupation", nil];
NSLog(@"d1: %@", d1);

//NSDictionary 个数
NSLog(@"d1 count: %ld", [d1 count]);

//NSDictionary 枚举keys/values
//NSEnumerator *keys1 = [d1 keyEnumerator];
NSEnumerator *objs1 = [d1 objectEnumerator];
for (NSObject *obj1 in objs1) {
NSLog(@"obj: %@", obj1);
}

//NSDictionary 根据key获取object
NSLog(@"obj: %@", [d1 objectForKey:@"Location"]);

//NSMutableDictionary 初始化        dictionaryWithCapacity, dictionaryWithObjectsAndKeys:<#(id), ...#>, nil
NSMutableDictionary *d2 = [NSMutableDictionary dictionaryWithCapacity:2];
[d2 setObject:@"Shanghai" forKey:@"Location"];
[d2 setObject:@"Programmer" forKey:@"Occupation"];
NSLog(@"d2: %@", d2);
[d2 setObject:@"Male" forKey:@"Gender"];
NSLog(@"d2: %@", d2);


复制代码

 

1、初始化字典

NSDictionary *dictionary = [[NSDictionary alloc]initWithObjectsAndKeys:@"One",@"1",@"Two",@"2",@"Three",@"3",nil];
NSString *string = [dictionary objectForKey:@"One"];
NSLog(@"string:%@",string);
NSLog(@"dictionary:%@",dictionary);
[dictionary release];


复制代码

 

2、添加字典

[dictionary setObject:@"One" forKey:@"1"];
[dictionary setObject:@"Two" forKey:@"2"];
[dictionary setObject:@"Three" forKey:@"3"];
[dictionary setObject:@"Four" forKey:@"4"];


复制代码

 

3、删除字典

[dictionary removeObjectForKey:@"3"];





前最细致清晰的NSDictionary以及NSMutableDictionary用法总结

做过Java语言 或者 C语言 开发的朋友应该很清楚 关键字map 吧,它可以将数据以键值对儿的形式储存起来,取值的时候通过KEY就可以直接拿到对应的值,非常方便。在Objective-C语言中 词典对象就是做这个事情的,不过在同一个词典对象中可以保存多个不同类型的数据,不像Java与C 只能保存声明的相同类型的数据,它的关键字为NSDictionary与NSMutableDictionary。阅读过我之前文章的朋友应该从关键字的 结构就可以看出这两个的区别。很明显前者为不可变词典,或者为可变词典。NSDictionary *dict;for(NSString * akey in dict){  //........}很好用1.创建不可变词典[NSDictionary dictionaryWithObjectsAndKeys:..] : 使用键值对儿直接创建词典对象,结尾必需使用nil标志结束。[NSDictionary initWithObjectsAndKeys:..] :使用键值对儿初始化词典对象,结尾必需使用nil标志结束。[dictionary count]: 得到词典的长度单位。[dictionary keyEnumerator]: 将词典的所有KEY储存在NSEnumerator中,NSEnumerator很像Java语言 中的迭代器,使用快速枚举可以遍历词典中所有储存KEY值。[dictionary  objectEnumerator]: 将词典的所有value储存在NSEnumerator中,用法和上面差不多可用来遍历KEY对应储存的Value值。[dictionary objectForKey:key]: 通过传入KEY对象可以拿到当前KEY对应储存的值。
#import <UIKit/UIKit.h>
#import "MyClass.h"
int main(int argc, char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

//添加我们的测试代码

NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"雨松MOMO",@"name",@"15810463139",@"number", nil];

//得到词典的数量
int count = [dictionary count];
NSLog(@"词典的数量为: %d",count);

//得到词典中所有KEY值
NSEnumerator * enumeratorKey = [dictionary keyEnumerator];

//快速枚举遍历所有KEY的值
for (NSObject *object in enumeratorKey) {
NSLog(@"遍历KEY的值: %@",object);
}

//得到词典中所有Value值
NSEnumerator * enumeratorValue = [dictionary objectEnumerator];

//快速枚举遍历所有Value的值
for (NSObject *object in enumeratorValue) {
NSLog(@"遍历Value的值: %@",object);
}

//通过KEY找到value
NSObject *object = [dictionary objectForKey:@"name"];

if (object != nil) {
NSLog(@"通过KEY找到的value是: %@",object);
}

int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
}

 2.创建可变词典对象NSMutableDictionary 是NSDictionary的子类,所以继承了NSDictionary的方法。[NSMutableDictionary dictionaryWithCapacity:10] : 创建一个可变词典初始指定它的长度为10.,动态的添加数据如果超过10这个词典长度会自动增加,所以不用担心数组越界。推荐用这种方式[NSMutableDictionary initWithCapacity:10]  :只是初始化一个词典的长度为10。[dictionary setObject:@"雨松MOMO" forKey:@"name"] :向可变的词典动态的添加数据 ,这里的key是name ,值是雨松MOMO。如果词典中存在这个KEY的数据则直接替换这个KEY的值。(易混的地方,慎重!)[dictionary removeAllObjects..] : 删除掉词典中的所有数据。[dictionary removeObjectForKey..] :删除掉词典中指定KEY的数据 。
#import <UIKit/UIKit.h>
#import "MyClass.h"
int main(int argc, char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

//添加我们的测试代码

//创建词典对象,初始化长度为10
NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithCapacity:10];

//向词典中动态添加数据
[dictionary setObject:@"雨松MOMO" forKey:@"name"];

[dictionary setObject:@"15810463139" forKey:@"number"];

//通过KEY找到value
NSObject *object = [dictionary objectForKey:@"name"];

if (object != nil) {
NSLog(@"通过KEY找到的value是: %@",object);
}

int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
}

词典类的存在就是为了解决在大量数据中查找方便,因为它是通过key直接找到value所以速度很快,避免一个个的遍历寻找造成的效率低下,善用字典类会帮你的程序提速。文章出处:http://blog.csdn.net/xys289187120/article/details/682373
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息