• Objective-C语法之NSArray和NSMutableArray


     Objective-C的数组比C++,Java的数组强大在于,NSArray保存的对象可以是不同的对象。但只能保存对象,int ,char,double等基本数据类型不能直接保存,需要通过转换成对象才能加入数组。

    1、NSArray 不可变数组

    [array count] : 数组的长度。
    [array objectAtIndex 0]: 传入数组脚标的id 得到数据对象。
    [arrayWithObjects; ...] :向数组对象初始化赋值。这里可以写任意对象的指针,结尾必须使用nil。

    1.1、创建数组

    1、创建数组

    NSArray *array = [[NSArray alloc] initWithObjects:@"One",@"Two",@"Three",@"Four",nil];  

    2、数组所包含对象个数

    [self.dataArray count]  

    3、获取指定索引处的对象

    [self.dataArray objectAtIndex:2]  

    4、从一个数组拷贝数据到另一数组(可变数级)

        //arrayWithArray:
        //NSArray *array1 = [[NSArray alloc] init];
        NSMutableArray *MutableArray = [[NSMutableArray alloc] init];
        NSArray *array = [NSArray arrayWithObjects:
                          @"a",@"b",@"c",nil];
        NSLog(@"array:%@",array);
        MutableArray = [NSMutableArray arrayWithArray:array];
        NSLog(@"MutableArray:%@",MutableArray);

        array1 = [NSArray arrayWithArray:array];
        NSLog(@"array1:%@",array1);
     

    5、COPY

       NSMutableArray *newArray = [[NSMutableArray alloc] init];
        NSArray *oldArray = [NSArray arrayWithObjects:
                             @"a",@"b",@"c",@"d",@"e",@"f",@"g",@"h",nil];

        NSLog(@"oldArray:%@",oldArray);
        for(int i = 0; i < [oldArray count]; i++)
        {        
            obj = [[oldArray objectAtIndex:i] copy];
            [newArray addObject: obj];
        }
        //    
        NSLog(@"newArray:%@", newArray);
        [newArray release];
     

    6、深COPY

     //NSMutableArray *newArray = [[NSMutableArray alloc] init];
        NSArray *oldArray = [NSArray arrayWithObjects:
                             @"a",@"b",@"c",@"d",@"e",@"f",@"g",@"h",nil];    
        NSLog(@"oldArray:%@",oldArray);    
        newArray = (NSMutableArray*)CFPropertyListCreateDeepCopy(kCFAllocatorDefault, (CFPropertyListRef)oldArray, kCFPropertyListMutableContainers);
        NSLog(@"newArray:%@", newArray);
        [newArray release];    
     

    7、快速枚举

    //NSMutableArray *newArray = [[NSMutableArray alloc] init];
        NSArray *oldArray = [NSArray arrayWithObjects:
                             @"a",@"b",@"c",@"d",@"e",@"f",@"g",@"h",nil];    
        NSLog(@"oldArray:%@",oldArray);

        for(id obj in oldArray)
        {
            [newArray addObject: obj];
        }
        //    
        NSLog(@"newArray:%@", newArray);
        [newArray release];  
     


    8、切分数组

    NSString *string = [[NSString alloc] initWithString:@"One,Two,Three,Four"];
    NSLog(@"string:%@",string);    
    NSArray *array = [string componentsSeparatedByString:@","];
    NSLog(@"array:%@",array);
    [string release];
     

    9、从数组合并元素到字符串

    NSArray *array = [[NSArray alloc] initWithObjects:@"One",@"Two",@"Three",@"Four",nil];
        NSString *string = [array componentsJoinedByString:@","];
        NSLog(@"string:%@",string);
     

    10、 给数组分配容量

     array = [NSMutableArray arrayWithCapacity:20];  

    11、 在数组末尾添加对象

    NSMutableArray *array = [NSMutableArray arrayWithObjects:@"One",@"Two",@"Three",nil];
    [array addObject:@"Four"];
    NSLog(@"array:%@",array);
     

    12、删除数组中指定索引处对象

    NSMutableArray *array = [NSMutableArray arrayWithObjects:@"One",@"Two",@"Three",nil];
    [array removeObjectAtIndex:1];
     NSLog(@"array:%@",array);

    2、NSMutableArray可变对象数组

    [NSMutableArray arrayWithCapacity:6] :初始化可变数组对象的长度,如果后面代码继续添加数组超过长度6以后NSMutableArray的长度会自动扩充,6是自己可以设置的颗粒度。
    [array addObject:...] : 向可变数组尾部添加数据对象。
    [array addObjectsFromArray:..] :向可变数组尾部添加一个数组对象。 

     

    2.1添加对象
    NSMutableArray *muArray = [NSMutableArray arrayWithCapacity:6]; [muArray addObject:@"对象1"];

    插入对象某下标下
    [muArray insertObject:@"搅局的" atIndex:2];

    NSRange range = NSMakeRange(0,3); 设置一个范围为 0 到 3 之间。
    [array removeObject:obj inRange:range] : 设置在一个范围内删除数据,如果这个范围内没有删除的这个对象则不会删除任何东西。例子中因为obj对象在 数组 0 到 3的范围内,所以obj就被删除掉了。

      2.2 removeObject和removeObjectIdenticalTo

      [array removeObject:(id)] :删除数组中指定元素,根据对象isEqual消息判断。

      [array removeObjectIdenticalTo:(id)] : 删除数组中指定元素,根据对象的地址判断

      [array removeObjectIdenticalTo:(id) inRange:(NSRange)] : 在指定范围内删除指定的元素。

      [array removeObjectAtIndex:(NSUInteger)]:删除数组中指定脚标索引的数据。

      [array removeObjectsInArray:(NSArray *)] :删除一个数组的元素。

    下面我们主要验证下removeObject  removeObjectIdenticalTo这两个方法的区别,

    先实验removeObject


    int main(int argc, const char * argv[]) { @autoreleasepool { NSString *str1 = [[NSString alloc] init]; NSString *str2 = [[NSString alloc] init]; NSString *str3 = [str1 stringByAppendingFormat:@"字符串"]; NSString *str4 = [str2 stringByAppendingFormat:@"字符串"]; NSMutableArray *muArray = [NSMutableArray arrayWithCapacity:6]; [muArray addObject:@"对象"]; [muArray addObject:str3]; [muArray addObject:str4]; for (NSObject * object in muArray) { NSLog(@"数组对象:%@", object); } if ([str3 isEqual:str4]) { NSLog(@"str1 isEqual str2"); } if (str3 == str4) { NSLog(@"str1 == str2"); } [muArray removeObject:str3]; for (NSObject * object in muArray) { NSLog(@"数组对象:%@", object); } [str1 release]; [str2 release]; } return 0; }
     数组对象:对象
    数组对象:字符串
     数组对象:字符串
     str1 isEqual str2
     数组对象:对象

    这时,“字符串”都被去除了。
    现在试试 removeObjectIdenticalTo

    代码改成: [muArray removeObjectIdenticalTo:str3];
    这是还有一个“字符串”留下来了。
    我们用对比两个对象isEqual,用==对比对象的地址,打印出来了str1 isEqual str2
        NSRange rang = NSMakeRange(0, 3);
            [muArray removeObject:obj inRange:rang];

    指定范围删除对象,其他方法也可以指定范围删除,如果对象不在这个范围内,则不会被删除。

    2.3替换某索引值对应的对象

    int main(int argc, const char * argv[])
    {
        @autoreleasepool {
            NSObject *obj = [[NSObject alloc]init]; 
    
            NSMutableArray *muArray = [NSMutableArray arrayWithCapacity:6];
            [muArray addObject:@"对象1"];
            [muArray addObject:@"对象2"];
            [muArray addObject:@"对象3"];
            [muArray addObject:@"对象4"];
            [muArray addObject:obj];
    
            for (NSObject * object in muArray) {
                NSLog(@"数组对象:%@", object);
            }
            [muArray replaceObjectAtIndex:4 withObject:@"字符串替换回来"];
            for (NSObject * object in muArray) {
                NSLog(@"数组对象:%@", object);
            }
            [obj release];
        }
        return 0;
    }
    数组对象:对象1
    数组对象:对象2
    数组对象:对象3
    数组对象:对象4  
    数组对象:字符串替换回来

     

    On the road。。。
  • 相关阅读:
    Java 堆和栈 垃圾回收 2015/9/16
    多态 Java 2015/9/16
    学校项目过程中知识点 Java 2015/9/15 晚
    Python print输出不换行
    Windows 加载EXT分区
    RouterOS 安全模式
    RouterOS Openswan l2tp ipsec
    RouterOS 自动邮件备份脚本
    python chnroutes ROS版
    Kinect 2.0&Speech 11 中文语音控制
  • 原文地址:https://www.cnblogs.com/ianhao/p/4418290.html
Copyright © 2020-2023  润新知