数组的定义:
数组:数组是有序对象的集合,用来储存对象的有序列表(需注意,不能储存基本数据类型,只能储存对象)。对象:类的具体实现
和字符串一样,数组也有可变数组和不可变数组之分,可变数组是不可变数组的子类,使用数组前得先创建数组对象
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]) {
//如果空值的花,做一些操作
}