您的位置:首页 > 职场人生

黑马程序员——NSArray和NSMutableArray的使用

2015-01-16 17:41 337 查看
[align=center]------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------[/align]

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: