整天捣鼓嵌入式,兼职搞搞iOS,这么折腾为了啥?都是为了俺的娃!
分类: iOS平台
2015-02-12 09:53:10
集合数据类型NSArray,NSDictionary,NSSet,NSData的用法
注意:
1.在Mutable集合的遍历过程中,不要去修改集合,否则遍历可能出错.
2.NSString,NSArray,NSDictionary都可以通过writeToFile方法归档为文件,只不过
NSString归档为普通文件,NSArray和NSDictionary归档为plist格式的文件.NSSet
没有writeToFile方法,必须通过转换成NSArray才可以归档为文件.
1.NSArray和NSMutableArray(子类)
数组是用于存储对象的顺序容器,同一个数组可以存储不同的对象.只能存储对象,不能存储
基本类型数据.像整数,浮点数这些都必须封装成NSNumber才可以存储到数组中.不可变数组
的结尾必须是一个nil对象,除此以外的对象都不能是nil.
数组的存储在内存上是连续的(有序集合),可以通过索引值访问.
NSArray *array = [NSArray arrayWithObjects:@"One",@"Two",@"Three",nil];
NSLog(@");
/* 1.通过索引for循环遍历 */
for(int i=0; i
{
NSLog(@"]);
}
/* 2.通过for in遍历数组 */
for(NSObject* object in array)
{
NSLog(@");
}
/* 3.使用枚举器来遍历数组 */
NSArray * myarray = @[@100,@"string"];
NSEnumeratot* enumerator = [myarray objectEnumerator];
while(object=[enumerator nextObject])
{
NSLog(@");
}
/* 4.创建可变数组 */
NSMutableArray * mutableArray = [NSMutableArray arrayWithCapacity:5];
[mutableArray addObject:[NSNumber numberWithInteger:1]];
[mutableArray addObject:[NSNumber numberWithInteger:2]];
[mutableArray addObject:[NSNumber numberWithInteger:3]];
[mutableArray addObject:[NSNumber numberWithInteger:4]];
[mutableArray addObject:[NSNumber numberWithInteger:5]];
[mutableArray addObject:[NSNumber numberWithInteger:6]];
NSLog(@"mutableArray count=%d",[mutableArray count]);
[mutableArray removeObjectAtIndex:0];
[mutableArray removeAllObjects];
2.NSDictionary和NSMutableDictionary(子类)
字典是由键-对象对组成的数据集合,相当于C++ STL中的map集合.不可变字典的结尾也必须
是一个nil对象.字典的存储在内存上是连续的,因此属于有序集合.
NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:
@"ShenZhen,Guangdong,China",//value
@"address",//key
@"Jimmy",//value
@"name",//key
nil];
NSLog(@");
/* 1.使用for遍历key来遍历字典 */
NSArray* keys = [dict allKeys];
for(int i=0; i
{
NSObject* key = keys[i];
NSLog(@" objectForKey:key]);
}
/* 2.使用for in遍历key来遍历字典 */
for(NSObject* key in keys)
{
NSLog(@" objectForKey:key]);
}
/* 3.使用key枚举器遍历字典 */
NSEnumerator* keyEnumerator = [dict objectEnumerator];
NSObject* key;
while(key = [keyEnumerator nextObject])
{
NSLog(@" objectForKey:key]);
}
/* 4.使用值枚举器遍历字典 */
NSEnumerator* valueEnumerator = [dict objectEnumerator];
NSObject* value;
while(value = [valueEnumerator nextObject])
{
NSLog(@");
}
Key值在字典中必须是唯一的,字典内部使用hash算法保证其唯一性.通常情况下key的类型为NSString
或者NSNumber,实际上,任何一种NSObject类型的数据都可以自定义为key,只要我们实现其hash方法,
保证其唯一性即可.value值可以是任意对象.
NSDictionary *dict = [NSDictionary dictWithObjectsAndKeys:@"value01",@"key01",[NSNumber
numberWithInt:100],@"key02",nil];
3.NSSet和NSMutableSet(子类)
Set是一组单值对象的集合.它与数组很像,也是用于存储对象.它属于无序集合,不是按顺序存储数据,而是
通过散列表(hash)来存储对象的,不能像数组一样通过索引来访问,并且相同的元素也只允许存在一份,而
NSArray中的相同的元素可以存在多份.
NSSet* set = [NSSet setWithObjects:@"One",@"Two",@"Three",nil];
//1.用for in来遍历
for(NSString* str in set)
{
NSLog(@");
}
//2.用枚举器来遍历
NSEnumerator* valueEnumerator = [set objectEnumerator];
NSObject* object;
while(object = [valueEnumerator nextObject])
{
NSLog(@");
}
4.NSData与NSMutableData(子类)
NSData用于存储二进制字节流(即原始数据).我们可以把各种对象转换成NSData,也可以从NSData中恢复对象.
//将NSString转成NSData
NSString * str = @"hello, world!";
NSData * data = [str dataUsingEncoding:NSUTF8StringEncoding]; //NSString转换成NSData类型
NSLog(@"%s", data.bytes);
//将NSData转成NSString
NSString * newStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@", newStr);
//NSData转换为UIImage
NSData *imageData = [NSData dataWithContentsOfFile: imagePath];
UIImage *image = [UIImage imageWithData: imageData];
//UIImage转换为NSData
NSData *imageData = UIImagePNGRepresentation(aimae);
---------------------------------------------------------------------
//读写二进制文件的例子
NSString *path = @"/Users/cblock/Desktop/test.bin";
NSString *temp = @"Hello World!";
int i = 99;
float f = 88.8888f;
NSMutableData *writer = [[NSMutableData alloc] init];
[writer appendData:[temp dataUsingEncoding:NSUTF8StringEncoding]];
[writer appendBytes:&i length:sizeof(i)];//&表示取址
[writer appendBytes:&f length:sizeof(f)];
[writer writeToFile:path atomically:YES];
[writer release];
int ii;
float ff;
NSString *ttemp;
NSData *reader = [NSData dataWithContentsOfFile:path];
ttemp = [[NSString alloc]initWithData:[reader subdataWithRange:NSMakeRange(0, [temp length])] encoding:NSUTF8StringEncoding];
[reader getBytes:&ii range:NSMakeRange([temp length], sizeof(ii))];
[reader getBytes:&ff range:NSMakeRange([temp length] + sizeof(ii), sizeof(ff))];
NSLog(@"string:%@ int:%i float:%f", ttemp, ii, ff);
[temp release];
[ttemp release];
[path release];
----------------------------------------------------------------------
5.NSNumber
由于基本类型中的数值表示并不是对象,因此OC提供了一个NSNumber类来包装这些数值.
可能你还见过类似的NSInteger,NSUInterger,这两个虽然跟NSNumber长得像,但这俩二
货其实并非对象,实质只是基本数据类型,只不过是用typedef定义了一下.用法举例:
NSNumber* myNumber = [NSNumber numberWithInteger:10];//将整数10封装成NSNumber对象
NSInteger myInt = [myNumber integerValue];//将对象拆包成基本数据类型
myNumber = [NSNumber numberWithLong:0xabcdef];//将long封装成NSNumber对象
NSLog(@"long = %l",[myNumber longValue]);
myNumber = [NSNumber numberWithChar:'A'];//将char型封装成NSNumber对象
NSLog(@"char = %c",[myNumber charValue]);
float myFloat = [NSNumber numberWithFloat:100.01];//将float型封装成NSNumber对象
NSLog(@"float= %.2f",[myNumber doubleValue]);
6.nil,NULL和NSNull的区别
NULL是基本数据类型,用于给任何指针赋值,一般用于不能用nil的场合,如SEL指针.
nil是一个对象,用于给对象指针赋值,表示该对象在内存中已经不存在了,如NSString* strObject = nil;
Nil是一个空类,实际上和nil是一样的,完全可以互换,但一般我们用Nil来赋值给类,Class classA=Nil;
NSNull是一个类,其代表的对象在内存还存在(还占用一定的内存空间),只不过其值为空,类似于我们memset
一段值为0的内存,其在集合中用于表示值为空的对象.NSNull类只有一个方法+(NSNull*)null,返回一个空值对象.
在数组中要判断一个值是否是空值应该这样判断:
if([NSNull null]==(NSNull*)(array[index]))
{
NSLog(@"array[%d] is a NSNull",index);
}