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

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值