数组的定义: 数组:数组是有序对象的集合,用来储存对象的有序列表(需注意,不能储存基本数据类型,只能储存对象)。对象:类的具体实现 和字符串一样,数组也有可变数组和不可变数组之分,可变数组是不可变数组的子类,使用数组前得先创建数组对象 NSArray类:(不可变数组) 1.数组的初始化: 实例方法:NSArray* array=[[NSArray alloc]initWithObject:@"one",@"tow",nil]; 类方法:NSArray * array=[NSArray arrayWithObject:@"one",@"tow",nil]; 2.获得数组里元素的个数 -(NSUInteger)count; 例如:int count=[array count]; 3.获得数组中得元素: -(id)objectAtIndex:(NSUInteger)index; 例如:NSString * srt=[array objectAtIndex:1];//str的值为@"tow" NSArray类使用注意事项: 1.数组越界,访问NSArray时,最好检查一下索引是否越界 2.数组会对加入其中的对象引用计数加一(内存管理方面) 3.不能再中间加nil,nil是数组结束的标示符
NSMutableArray类:(可变数组) NSMutableArray是NSArray的子类,所以NSArray的一些方法对MutableArray也适用 1.可变数组的初始化: 实例方法:-(id)initWithCapacity:(NSUInteger)numItems; 例如:NSMutableArray* array=[[NSMutableArray alloc]initWithCapacity:12]; 类方法:+(id)initWithCapacity:(NSUInteger)numItems; 2.增加对象: -(void)addObject:(id)anObject;//在最后面添加 例如:[array addObject:@"three"]; 指定位置添加 -(void)insetObject:(id)anObject atIndex:(NSUInteger)index;//在index处插入一个anObject对象,在index后的对象后移一位 3.删除对象: -(void)removeAllObject;//删除数组内的全部对象 -(void)removeLastObject;//删除数组的最后一个对象 -(void)removeObjectIndex:(NSUInteger)index;//删除指定对象 4.替换: -(void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject;//在index位置替换成anObject对象 数组的遍历: for(int i=0;i>[array count];i++) { NSL(@"%@",[array objectAtIndex:i]); }
字典NSDictionary(不可变): 首先想一下这几个问题,什么是字典?为什么要用字典?字典和数组的区别是什么? 字典:就是关键字及其定义所构成的集合。使用字典查找信息比数组快的多。字典的储存方式跟数组不一样,它是采用键查询的优化存储方式,它可以通过关键字立刻查询出来要找的数据,而不用去遍历整个集合去查找。字典和字符串、数组一样也有可变和不可变之分
1.创建: -(id)dictionaryWithObjectAndKeys:(id)obj,..,..; 例如:Student * stu1=[Student new]; Student * stu2=[Student new]; NSDictionary * dict=[NSDictionary dictionaryWithObjectAndKeys:stu1,@"peter",stu2,@"andy",nil]; //说明,参数和键都是成对出现,最后以nil为结束标志 2.查找: -(id)objectForKey:(id)aKey;//使用键来寻找索要查找的对象 例如:id student=[dict objectForKey:@"peter"];//得到“peter”键的对象 3.注意事项: 创建字典时,字典的键和数值都要是id(即对象)类型的; 创建字典时,传进的参数是键值对,即键和对象要成对出现,最后不要忘记加nil; 字典的关键字(键)不要重复,如果重复了,后面的值就会覆盖前面的。 NSMutableDictionary类(可变): 可变字典类是不可变字典的子类,所以上面所用的方法对NSMutableDictionary也适用 1.创建: +(id)dictionaryWithCapacity:(NSUInteger)num; 例如:NSMutableDictionary* dict=[NSMutableDictionary dictionaryWithCapacity:5] //说明:创建了初始化大小为5个键值对的可变字典,5只是初始大小,用以提高效率,超过5也会继续往后添加 2.添加: -(void)setObject:(id)obj forKey(id)aKey;//关键字和对象成对出现 例如:Student *stu1=[Student new]; Student *stu2=[Student new]; NSMutableDictuinary* dict2=[NSMutableDictionary dictionaryWithCapacity:2]; [dict2 setObject:stu1 forKey:@"y"]; [dict2 setObject:stu2 forKey:@"k"]; //注意:如果你添加的关键字在原来字典已经有了,那么你添加的会覆盖原来的关键字的值 3.删除: -(void)removeObjectForKey:(id)aKey;//根据关键字删除对应的数据 例如:对上面新建的字典操作:[dict2 removeObjectForKey:@"y"];结果stu1对象从字典中移除 -(void)removeAllObject;//删除所有数据
4.字典的遍历: 由于字典是以键值对的形式储存数据,所以无法直接适用索引来遍历字典中得元素,但字典中有一个方法allKeys: -(NSArry*)allKeys;//得到字典的所有key值,返回一个数组中,通过返回的数组得到相应的对象,不可变和可变字典遍历方法一样 适用for循环遍历存放所有的keys的每一个Key,然后再根据key得到相对于的对象 Student* stu1=[Student new];
Student* stu2=[Student new]; NSDictionary* dict=[NSDictionary dictionaryWithObjectsAndKeys:stu1,@"m",stu2,@"k", nil]; NSArray* keys=[dict allKeys]; id key,value; for (int i=0; i<[keys count]; i++) { key=[keys objectAtIndex:i]; value=[dict objectForKey:key]; NSLog(@"key:%@,value:%@",key,value); }
Set集合(NSSet,不可变): NSSet集合跟数组差不多,但Set集合不能存放相同的对象,它是一组单值对象的集合,被存放对进集合中得数据的无序的。 1.NSSet的初始化: -(id)initWithObjects:(id)firstObject,...,nil; +(id)setWithObjects:(id)firstObject,...,nil; 例如:NSSet* set=[[NSSet alloc]initWithObjects:@"one",@"two",nill; 2.NSSet的个数: -(NSUInteger)count; 3.NSSet中得元素: -(NSArray*)allObject;//得到集合中所有元素,以数组的形式返回 -(id)anyObject;//随机获得集合中某个元素 4.NSSet的一些判断方法: -(BOOL)isEqualToSet:(NSSet*)otherSet;//判断和另一集合otherSet是否相等 -(BOOL)member:(id)obj;//判断本集合是否包含对象obj 5.需要注意的: Set集合不能存放相同对象,元素都是无序存放的 它和数组不同的是: NSArray:有序几集合,储存元素在一个整块的内存中并按序排列 NSSet:无序集合,散列存储。 在搜索一个对象时,NSSet比NSArray效率高,主要是因为NSSet用到一个算法hash(散列,直译为哈希),NSSet直接通过hash找到想要找的元素,而数组则要遍历整个数组,显然效率要低。 NSMutableSet(可变): 1.NSMutableSet的创建: -(id)initWithCapacity:(NSUInteger)numItems;//实例方法 +(id)setWithCapacity:(NSUInteger)numtems;//类方法 同样numtems是初始大小,并不限制集合大小 2.增加集合的元素: -(void)addObject:(id)object; //[set addObject:student]; 3.删除集合中得元素 -(void)removeAllObject;//删除集合中所有元素 -(void)removeObject:(id)object;//删除集合中object对象 例如:[set removeObject:student];
数组数据: 上面所说得集合不能存放基本数据类型,那么如何把基本数据类型封装成对象呢?NSNumber类型就是解决这一问题 NSNumber类: 1.创建封装方法 +(NSNumber)numberWithChar:(char)value;//封装一个char数据类型 +(NSNumber)numberWithInt:(int)value;//封装一个int数据类型 +(NSNumber)numberWithFloat:(float)value;//封装一个单精度数据类型 +(NSNumber)numberWithBOOL:(BOOL)value;//封装一个双精度数据类型 以上是所列举的类方法 -(id)initWithChar:(char)value; -(id)initWithInt:(int)value; -(id)initWithFloat:(float)value; -(id)initWithBOOL:(BOOL)value; 比如:NSNumber *number=[NSNumber numberWith:3];//把int类型的3封装成一个NSNumber; 上面是封装基本类型的,那结构体该这么封装呢?用NSValue NSValue的创建及使用: +(NSValue*)valueWithBytes:(const void*)value objCType:(const char*)type; 第一个参数是机构体地址,第二个参数是用来描述这个数据类型的字符串,用来说明结构体中得实体的类型和大小,用@encode编译器指令可以接受数据类型的名字并为你生成适合的字符串。 NSRect rect=NSMakeRect(4,4,100,100); NSValue* value=[NSValue valueWithBytes:&rect objCType:@encode(NSRect)]; [array addObject:value]; 这样我们就把一个结构体封装成一个NSValue类型的对象 从NSValue中获取值 -(void)getValue:(void *)value; 调用getValue时,要传递的是要存储这个数值的变量地址,类似scanf()函数 比如:NSValue *value=[array objectAtIndex:0]; NSRect rect1; [value getValue:&rect1]; 这样就把NSValue转换成结构体的结果通过rect1的地址赋值给rect1.
NSNull nil放进集合里面代表着结束,那如何要把空值存放到集合里面? cocoa提供了一个NSNull类,用这个类来封装nil空值。 +(NSNull*)null; 比如:[array addObject:[NSNull null] ]; id nullValue=[array objectAtIndex:0]; if (nullValue==[NSNull null]) { //如果空值的花,做一些操作 }
|
|
来自: 昵称10504424 > 《工作》