黑马程序员——NSArray和NSMutableArray的使用
2015-01-16 17:41
337 查看
[align=center]------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------[/align]
限制: 只能存储Objective—C 的对象, 不能存储C 语言的基本数据类型 (int、float、enum、struct、 或者NSArray中的随机指针) 。同时也不能存储nil(对象的零值或NULL值)
3》如何使用NSLog输出自定义的对象
NSArray和NSMutableArray的使用
1.NSArry不可变数组
用来存储对象的有序列表(任意类型的对象)限制: 只能存储Objective—C 的对象, 不能存储C 语言的基本数据类型 (int、float、enum、struct、 或者NSArray中的随机指针) 。同时也不能存储nil(对象的零值或NULL值)
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { // NSArray数组类的使用 //@"张三" @“lisi” @“lilei” @“hanmeimei” //NSArray创建和初始化 NSArray *array=[[NSArray alloc]initWithObjects:@"zhagnsan",@"lisi",@"lilei",@"hanmeimei", nil]; //获取对象objectAtINdex; //细节:下标越界之后会直接崩溃 NSString *str=[array objectAtIndex:3]; NSLog(@"str=%@",str); //1遍历访问数组中的对象 //常用的有两种 //获取数组的元素个数 long count =[array count]; for (int i=0; i<count; i++) { NSString *s=[array objectAtIndex:i]; NSLog(@"s=%@",s); //逐个输出数组中的元素 } //快速遍历:forin结构 //forin每次从array取出一个对象 //nsstring * 指向每次取出的对象 for (NSString *s1 in array) { NSLog(@"forin: %@",s1); } //2查找一个对象(获取对象的位置) //知道某个对象的位置 //细节:找到不指定对象的时候会返回NSotFound long loc=[array indexOfObject:@"lilei"]; NSLog(@"loc=%ld",loc); } return 0; }
2.NSMutableArray可变数组
#import <Foundation/Foundation.h> #import "Cat.h" int main(int argc, const char * argv[]) { @autoreleasepool { #if 0 // <1>创建, //创建了一个空的数组,可以在以后添加对象 NSMutableArray *marr=[[NSMutableArray array] init]; //<2>添加,andobject [marr addObject:@"GaoYuanYuan"]; [marr addObject:@"HuangHaiBo"]; [marr addObject:@"DaZhangWei"]; NSLog(@"marr = %@",marr); //<3>插入, [marr insertObject:@"GaoJian" atIndex:1]; NSLog(@"marr = %@",marr); //<4>移除, [marr removeObjectAtIndex:1]; NSLog(@"marr = %@",marr); //<5>替换,第三个对象替换为Yinxiaotian [marr replaceObjectAtIndex:2 withObject:@"YinXiaoTian"]; NSLog(@"marr = %@",marr); #endif #if 0 //<6>排序【难点,重点,不好理解】 //(1)使用冒泡或者选择 //(2)系统对象的排序 //(3)自定义对象的排序 NSMutableArray *marr = [[NSMutableArray alloc]init]; [marr addObject:@"BB"]; [marr addObject:@"DD"]; [marr addObject:@"AA"]; [marr addObject:@"CC"]; //选择排序 /* long count = [marr count]; for(long i=0;i<count-1;i++){ for (long j=i+1; j<count; j++) { NSString *obj1=[marr objectAtIndex:i]; NSString *obj2=[marr objectAtIndex:j]; //如果obj1字符串大于obj2字符串 if ([obj1 compare:obj2]>0) { //交换两个对象 [marr exchangeObjectAtIndex:i withObjectAtIndex:j]; } } } NSLog(@"marr=%@",marr); */ //sortedArrayUsingSelector:对数组进行排序 //内部实现了一种排序的算法 //数组中可以存储不同类型的对象,不知道如何比较两个对象 //使用这个排序方法的前提: 核心: 要告诉这个方法数组中的两个对象应该如何比较 //sel类型做参数意味着直接传入一个方法 //@selector 获取签名的地址 //sortUsingSelector内部会调用compare;方法完成两个对象比较的操作 [marr sortUsingSelector:@selector(compare:)]; NSLog(@"marr=%@",marr); //方法的签名 //-(void)setAll; //签名:setx //-(void)setX:(int)x; //setX: //-(void)setX:(int)x andY:(int)y; //setX: andsetY: #endif //数组中是自定义的类 Cat *xinxin=[[Cat alloc]init]; xinxin.nickname=@"xinxin"; xinxin.age=3; xinxin.weight=10; Cat *momo=[[Cat alloc]init]; momo.nickname=@"momo"; momo.age=1; momo.weight=3; Cat *kitty=[[Cat alloc]init]; [kitty setAge:3]; [kitty setWeight:12]; [kitty setNickname:@"kitty"]; NSMutableArray *marr = [[NSMutableArray alloc]init]; [marr addObject:xinxin]; [marr addObject:kitty]; [marr addObject:momo]; //按名字排序 //自己在这个类中实现一个比较两个对象的方法 [marr sortUsingSelector:@selector(compareNameWithObject:)]; //NSLog(@"marr =%@",marr); 输出的是指针的地址 for (Cat *cat in marr) { NSLog(@"nickname=%@,age=%f,weight=%f",[cat nickname],[cat age],[cat weight]); } } return 0; } ************************************************************ #import <Foundation/Foundation.h> @interface Cat : NSObject { //实例变量 NSString *_nickname; double _age; double _weight; } -(void)setNickname:(NSString *)nickname; -(NSString *)nickname; -(void)setAge:(double)age; -(double)age; -(void)setWeight:(double)weight; -(double)weight; //为了可以使用sortUsingSelector进行比较 //添加比较方法 //当前cat对象和另外一个Cat对象比较 -(int)compareNameWithObject:(Cat *)cat; @end ************************************************************ #import "Cat.h" @implementation Cat -(void)setNickname:(NSString *)nickname; { _nickname=nickname; } -(NSString *)nickname; { return _nickname; } -(void)setAge:(double)age; { _age=age; } -(double)age; { return _age; } -(void)setWeight:(double)weight; { _weight=weight; } -(double)weight; { return _weight; } -(int)compareNameWithObject:(Cat *)cat; { //返回值的含义 // 返回值表示是否交换比较的两个对象 //比较当前对象的nickname和传入cat的nickname //当前对象的nickname NSString *name1=[self nickname]; NSString *name2=[cat nickname]; int ret = [name1 compare:name2]; //返回1表示前面的字符串比较大,需要交换 return ret>0; } @end
3.字符串处理相关(分割和合并)
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //<1>字符串的分割和合并(使用另外一个字符串分割) NSString *str=@"xian kan ting qian hua kai hua luo"; NSArray *array=[str componentsSeparatedByString:@" "]; NSLog(@"array=%@",array); //<2>字符串的分割(使用字符集合分割) //分割出名字,年龄,性别,体重 //分隔符:“;,” NSString *str2=@"zhangsan:188,B,120"; array = [str2 componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@":,"]]; NSLog(@"array=%@",array); //<3>数组合并为一个字符串 NSString *comString=[array componentsJoinedByString:@"-"]; NSLog(@"comString = %@",comString); } return 0; }
4.类别Category
#import <Foundation/Foundation.h> @interface NSMutableString (Ext) //实例变量不能加在类别里 // 类别可以为任何类(系统的或者自己的)添加一个方法 // 但是不能添加一个实例变量 //细节1:如果类别中的方法是这个已经存在的 //例如:类中已经有方法test,通过类别添加了一个test方法,优先使用类别中的方法 // 避免添加的方法和类原有的方法重名, // -(void)reverseString; @end #import "NSMutableString+Ext.h" @implementation NSMutableString (Ext) -(void)reverseString; { long len=[self length]; NSMutableString *mstr=[[NSMutableString alloc]init]; for (long i=len-1; i>=0; i--) { [mstr appendFormat:@"%C",[self characterAtIndex:i]]; } [self setString:mstr]; } @end #import "NSMutableString+Ext.h" #import <Foundation/Foundation.h> /* //使用类别为:NSMutableString条件方法reverseString; //定义一个类别 //表示为NSMutableString添加了一个类别Ext // @interface NSMutableString (Ext) -(void)reverseString; @end @implementation NSMutableString (Ext) -(void)reverseString; //逆序字符串 { //当前的字符 //self是方法的隐藏参数,存储了当前对象的指针 //如何使用:类外使用对象指针操作这个对象,类的方法内部使用self表示当前对象 //类的方法内部,使用其他方法,使用self调用 long len=[self length]; NSMutableString *mstr=[[NSMutableString alloc]init]; for (long i=len-1; i>=0; i--) { [mstr appendFormat:@"%C",[self characterAtIndex:i]]; } [self setString:mstr]; } @end */ int main(int argc, const char * argv[]) { @autoreleasepool { //逆序这个字符串 //NSMutableString没有逆序的方法 NSMutableString *string = [[NSMutableString alloc]initWithString:@"LOl"]; //类别:Category:可以系统的或者自己的类添加方法 //系统的类没有源代码,使用类别也可以添加 [string reverseString]; NSLog(@"string=%@",string); } return 0; }
5.几个问题
1》如何判断对象类型#import <Foundation/Foundation.h> @interface Dog : NSObject { NSString *_name; } -(void)setName:(NSString *)name; -(NSString *)name; @end #import "Dog.h" @implementation Dog -(void)setName:(NSString *)name; { _name=name; } -(NSString *)name; { return _name; } @end #import <Foundation/Foundation.h> #import "Dog.h" int main(int argc, const char * argv[]) { @autoreleasepool { // Dog *amao=[[Dog alloc]init]; [amao setName:@"amao"]; Dog *agou=[[Dog alloc]init]; [agou setName:@"agou"]; NSArray *array=[[NSArray alloc]initWithObjects:amao,@"123",agou,@"345", nil]; for (id obj in array) { //NSLog(@"obj=%@",obj); //需求:如果obj这个对象是Dog类的对象 //不能直接用%@打印 //解决:判断对象的类型 BOOL b = [obj isMemberOfClass:[Dog class]]; if (b) { NSLog(@"dog name = %@",[obj name]); }else //不是dog类的对象 { NSLog(@"str=%@",obj); } } } return 0; }2》如何存储基本数据类型
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { // 100 200 300 400 800 //存储到NSArray //细节:NSSArray只能存储oc的对象,不能存储c语言的基本数据类型 //使用NSNumber简介的介入 NSNumber *num1=[NSNumber numberWithInt:100]; NSNumber *num2=[NSNumber numberWithInt:200]; NSNumber *num3=[NSNumber numberWithInt:300]; NSArray *array=[[NSArray alloc]initWithObjects:num1,num2,num3,nil]; NSNumber *num=[array objectAtIndex:0]; int n=[num intValue]; NSLog(@"%d",n); } return 0; }
3》如何使用NSLog输出自定义的对象
#import "Dog.h" #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { Dog *xiaohua = [[Dog alloc] init]; xiaohua.name=@"xiaohua"; xiaohua.age=2; NSLog(@"xiaohua=%@",xiaohua); } return 0; } #import <Foundation/Foundation.h> @interface Dog : NSObject { NSString *_name; int _age; } -(void)setName:(NSString *)name; -(NSString *)name; -(void)setAge:(int)age; -(int)age; @end #import "Dog.h" @implementation Dog -(void)setName:(NSString *)name; { _name=name; } -(NSString *)name; { return _name; } -(void)setAge:(int)age; { _age=age; } -(int)age; { return _age; } //重写Dog类的某个方法 // -(NSString *)description { //有两个实例变量,age,name NSString *str =[NSString stringWithFormat:@"dog name = %@,age=%d",_name,_age]; return str; } @end
相关文章推荐
- 黑马程序员——Foundation框架NSArray和NSMUtableArray的介绍及使用
- 黑马程序员——Foundation框架——NSArray和NSMutableArray的介绍及使用
- 《黑马程序员》 NSArray和NSMutableArray的使用(Objective - c语法)
- 使用NSArray与NSMutableArray的注意事项
- Ojbect-C2 3、NSArray和NSMutableArray数组的使用
- 黑马程序员-------NSArray(NSMutableArray);
- OC学习之道:OC对象,字符串和数组的使用方法NSString,NSMutableString ,NSArray,NSMutableArray
- NSArray和NSMutableArray对象的使用
- 黑马程序员——Objective-C基础-NSArray & NSMutableArray
- NSArray和NSMutableArray的使用总结
- 黑马程序员---Foundation常用类之NSArray/NSMutableArray
- 03-黑马程序员-NSArray、NSMutableArray
- Objective-C NSArray和NSMutableArray的详解 使用
- NSArray,NSMutableArray的使用与内存问题
- 黑马程序员——Foundation框架——NSArray和NSMutableArray
- NSArray,NSMutableArray的使用与内存问题
- 集合:NSArray、NSMutableArray、NSDictionary、NSMutableDictionary、NSSet、NSMutableSet使用
- OC_关于NSArray、NSMutableArray的使用
- 黑马程序员——Objective-C学习之不可变与可变集合(NSArray\NSMutableArray)
- 黑马程序员------foundation_NSArray,NSMutableArray