• QF——OC数组


    OC中的数组:

    OC中的数组和它的字符串有很多相似之处。也分为可变和不可变。

    NSArray:不可变数组,一经初始化,便不能再更改;

    NSMutableArray:可变数组,它其实是继承于NSArray,所以NSArray的方法它都可以用,只不过又拓展了些数组自己操作的方法。

    NSArray数组的初始化:

            //NSArray:不可变数组
            
            //NSArray的实例化方法:
            //对象方法:
            NSArray * arr1 = [[NSArray alloc]initWithObjects:@"one",@"two",@"three", nil]; //末尾的nil表示结束符
            NSArray * arr2 = [[NSArray alloc]initWithArray:arr1]; //通过已存在的数组实例化新数组
            
            //类方法:
            NSArray * arr3 = [NSArray arrayWithObjects:@"one",@"two",@"three", nil];
            NSArray * arr4 = [NSArray arrayWithArray:arr3];
            
            //Xcode新版本的便捷方法:
            NSArray * arr5 = @[@"one",@"two",@"three"];  //类似于NSString * str = @"wanger";且此时数组结尾无nil!

    NSArray数组的一些常用方法:

            
            //NSArray常用方法:
            NSArray *arr = [NSArray arrayWithObjects:@"one",@"two",@"three",nil];
            
            //求元素个数:count
            NSUInteger count = [arr count];
            NSLog(@"count = %lu",count);
            
            //获取某位置元素
            id obj = [arr objectAtIndex:2];
            NSLog(@"%@",obj);
            //其实这个方法很鸡肋。arr[index]效果一样
            NSLog(@"%@",arr[2]);
            
            //获取某元素的索引
            NSInteger index = [arr indexOfObject:@"one"];
            NSLog(@"index = %lu",index);
            
            //判断该数组是否包含某元素
            BOOL tag = [arr containsObject:@"two"];
            if(tag==YES)
            {
                NSLog(@"嗯,包含了。");
            }else if (tag==NO)
            {
                NSLog(@"没包含。");
            }
            
            //获取数组最后一个元素
            id obj2 = [arr lastObject];
            NSLog(@"lastObject为 %@",obj2);
            
            //将数组各元素连接成字符串对象
            NSString *str = [arr componentsJoinedByString:@"+"];
            NSLog(@"%@",str);
    
           //将字符串通过分隔符转换成数组
            NSString * str1 = @"welcome to shenzhen";
            NSArray *arr1 = [str1 componentsSeparatedByString:@" "];
            NSLog(@"%lu",[arr1 count]);
            
            NSString *str2 = @"Hi,wang.weclome";
            id seqSet = [NSCharacterSet characterSetWithCharactersInString:@",."];
            NSArray *arr2 = [str2 componentsSeparatedByCharactersInSet:seqSet];
            NSLog(@"%lu",[arr2 count]);
            NSLog(@"%@",arr2);
    
            NSString *str3 = @"yes i am a bad body";
            NSArray *arr3 = [str3 componentsSeparatedByString:@" "];
            int i;
            NSMutableString *mStr = [NSMutableString stringWithUTF8String:""];
            for (i=(int)[arr3 count]-1; i>=0; i--)
            {
                [mStr appendString:arr3[i]];
                [mStr appendString:@" "];
            }
            NSLog(@"%@",mStr);

    OC遍历数组的3种方法:

    第3种要重点掌握!

            //数组遍历
            NSArray *arr1 = [NSArray arrayWithObjects:@"one",@"two",@"three",nil];
            //1.最基本原始方法:for循环
            
            //2.迭代器
            NSEnumerator *erator = [arr1 objectEnumerator];
            
            id obj;
            while ((obj=[erator nextObject])!=nil)
            {
                NSLog(@"%@",obj);
            }
            
            //3.增强型for循环
            //for(对象类型 对象名 in 列表)
            //优点:不需要开发者判断结束条件,自动结束
            for (id obj in arr1)
            {
                NSLog(@"%@",obj);
            }

    NSMutableArray数组的常用方法:

    //
    //  main.m
    //  ArrayTest
    //
    //  Created by mac on 15-2-27.
    //  Copyright (c) 2015年 mac. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import "Dog.h"
    int main(int argc, const char * argv[])
    {
    
        @autoreleasepool {
            /*
             OC数组的本质是C里“指针数组”的实现。它里存储的只是对象的引用,即对象的地址。
             void * arr[10]
             */
    
    
            
            //NSMutableArray,可变数组。
            
            //NSMutableArray继承于NSArray类,可以使用NSArray所有的方法
            //因为NSMutableArray是可变数组,所以不能用 marr = @[@"one",@"two"];这样快速创建。
            NSMutableArray *marr = [NSMutableArray arrayWithObjects:@"one",@"two",nil];
            
            //常用操作方法
            
            //
            [marr addObject:@"three"]; //从最后添加
            [marr insertObject:@"zero" atIndex:0];  //插入指定的位置
            NSLog(@"%@",marr);
            
            //
            [marr removeLastObject];  //删除最后一位元素
            [marr removeObject:0]; //删除指定位置元素
            [marr removeObject:@"one"]; //删除指定元素
            [marr removeAllObjects]; //删除所有元素(清空数组)
            
    
            [marr removeObjectIdenticalTo:@"one"];
            NSLog(@"%@",marr);
            
            
            ////otherArr
            [marr setArray:@[@"wang1",@"wang2",@"wang3"]];  //重置数组
            [marr replaceObjectAtIndex:0 withObject:@"1wang"];  //替换某位的对象
            NSLog(@"%@",marr);
            
            
        }
        return 0;
    }

    如何在OC数组中存储基本类型数据?

      

      C中数组存储的是同类型的基本类型数据;

      OC中数组存储的是对象,它的所有元素都是对象。

      那我们怎么在OC数组中存储基本类型数据呢?

      OC提供了NSNumber类,它通过numberWithInt:(int)num 等方法把int型的基本类型数据转换为NSNumber型对象,这个过程称为装箱。这样就可以存储在OC对象中了!

            NSArray *arr1 = @[@"one",@"two",@"three"];
            NSArray *arr2 = @[@"four",@"five",@"six"];
            NSArray *arr3 = @[@"seven",@"eight",@"nine"];
    
            NSArray *arr = @[arr1,arr2,arr3];
            
            //怎么在OC数组中存储基本类型数据,比如数字?
            //数字类NSNumber
            NSNumber * num1 = [NSNumber numberWithInt:1];  //把int型数字1转换为NSNumber对象
            NSNumber * num2 = [NSNumber numberWithInt:2];
            NSNumber * num3 = [NSNumber numberWithInt:3];
            
            NSArray *numArr = @[num1,num2,num3];  //把数字对象存进OC数字里
            for(id obj in numArr)  //遍历arr数组
            {
                NSLog(@"%i",[obj intValue]);  //obj分别为arr[0],arr[1],arr[2];即num1,num2,num3对象,调用它们的intValue方法,把对象转换为int型数据
            }
            

     装箱和拆箱:

      把基本类型数据转换成对象类型的数据,这个过程称为装箱;相反的,把对象转换为基本类型数据的过程称为拆箱。

      在Java中,把基本类型数据,比如int型数字的装箱操作就是把它转换为包装类Integer。而且Java中的装箱和拆箱都是全自动的,不同程序员动手,它自己会完成。也就是说,若要往容器中放入数字等,程序员只要直接放就行了,编译器会自动把它们转换为包装类型的对象。

      但是在OC中,装箱是通过  NSNumber num1 = [numberWithInt : 3] ;——>把数字3转换为NSNumebr类型的对象num1;

      拆箱是通过 [num1 intValue] ;——>把NSNumber类型的对象转换为int型数字。

      不过,在新版本的OC中,装箱动作有了便捷方式:在基本类型数据前加上 @ ,就完成装箱了。

            NSArray * arr = @[@3,@4,@5];  //便捷装箱方式:把数字3,4,5分别装入数组arr中。
            NSLog(@"%@",arr);
  • 相关阅读:
    vue 添加对象的新属性的方法
    vue 简单的c3属性写法
    大数据分析技术生态圈一览
    网络
    Axis2 WebService客户端Axis2调用
    前端资源
    不错的数据库
    dubbo
    大数据相关
    This is very likely to create a memory leak 异常
  • 原文地址:https://www.cnblogs.com/wangerxiansheng/p/4301938.html
Copyright © 2020-2023  润新知