10.10 晚上 NSArray方法练习

+ (void)nsArrayTest

{

    /*NSArray是不可变的,即初始化了之后,就不能添加和删除数组元素。也不能修改数组中的元素值。因为NSArray中没有提供相应方法

     NSArray只能存储OC的对象,不能存储C语言的基本数据类型和其指针形式,也不能存储nil。

     */

    NSArray *array = [NSArray arrayWithObjects:@"zhangsan", @"lisi", [[Student alloc] initWithAge:21 andWeight:64],nil];//注意nil是结束符,有点像‘\0’的意思。

    //上面形式等价于:array = @[@"zhangsan",@"lisi"]

   

    //1.count方法和count属性都可以获取当前数组对象中包含的元素个数。

    NSLog(@"%lu  %lu", (unsigned long)[array count], array.count);

    //2.-(id)objectAtIndex: 该方法获取数组中由参数指定的索引处的元素,如果参数索引越界,会报NSRangeException; 该方法的等价形式是array[i];

   

    //3.- (NSArray *)arrayByAddingObject:(id)anObject;

    /*该方法将返回一个复制了调用该方法的数组对象,并且在该数组中末尾添加了一个参数指定的对象的数组。数组中包含对象的复制方式为浅复制。如果参数是nil,将会抛NSInvalidArgumentException异常。

     */

    NSArray *arr = array;

    array = [array arrayByAddingObject:@"wangwu"];

    for(id obj1 in arr){

        printf("<%p>", obj1);

    }

    printf("\n");

    for(id obj2 in array){

        printf("<%p>", obj2);

    }//证明数组元素的复制是浅复制。

    //4.- (NSArray *)arrayByAddingObjectsFromArray: 该方法将返回一个复制了调用该方法的数组对象并在末尾添加参数指定的数组对象中的元素的数组对象。同样是浅复制的。

    NSArray *array1 = @[@"zhaoliu", @"qianqi"];

    array = [array arrayByAddingObjectsFromArray:array1];

   

    //5. - (NSString *)componentsJoinedByString:(NSString *)separator; 该方法将调用数组中的所有对象的description方法并将这些结果按顺序一个接一个的用参数separator指定的字符串连接起来成为一个字符串,并返回。

    NSLog(@"%@", [array componentsJoinedByString:@":"]);

   

    //6.- (BOOL)containsObject:(id)anObject;该方法通过向数组中每个对象发送isEqual消息来看是否包含参数anObject指定的对象。isEqual是NSObject中声明的方法,通过对象的hash值来判别两个对象是否相等;一个类可以重写isEqual 和 hash方法,来实现该类自己的判别相等的方式;

    NSLog(@"%d", [array containsObject:@"qianqi"]);

   

    //7.下面两个方法是返回一个属性列表格式,能描述所有数组元素的字符串。如果元素是一个字符串,那么就把它本身所含的字符串加入返回字符串中;如果元素也能够响应下面这两个方法,那么就把元素调用这两个方法的返回值加入到返回字符串中;如果上述两个条件都不满足,则将元素调用其description的返回值加入到返回字符串中。这样一个接一个的元素进行。参数indent指的是缩进,0表示采用4个空格作为缩进,1表示采用tab作为缩进

    NSLocale *locale = nil;

    NSLog(@"%@", [array descriptionWithLocale:locale]);

    NSLog(@"%@", [array descriptionWithLocale:locale indent:0]);

   

    //8. - (id)firstObjectCommonWithArray:(NSArray *)otherArray; 返回两个数组中第一个相等的数组元素。注意不是索引值,而是元素对象。用isEqual判断元素是否相等。

   

    //9.- (void)getObjects:(id __unsafe_unretained [])objects range:(NSRange)range;

    //该方法将数组对象中由参数range指定的范围内的元素存储到参数objects指向的缓冲区中。objects是一个普通的c语言数组。它的大小至少应该是range范围内所有元素所占字节数之和。元素的都是指向对象的指针类型。

    NSRange range = NSMakeRange(1, 3);

    __unsafe_unretained id objects[sizeof(id) * range.length];

    [array getObjects:objects range:range];

    for(int i = 0; i < range.length; i++){

        NSLog(@"objects:%@", objects[i]);

    }

   

    //10.下面两个方法是求和参数指定的对象在 数组 或 数组的指定范围 中的第一个元素的索引值,如果没有找到,将返回NSNotFound(一个枚举元素,表示最大的整形数)。调用isEqual判别两个对象是否相等;

    NSLog(@"index of 'lisi': %lu", [array indexOfObject:[[Student alloc] initWithAge:21 andWeight:64]]);

    NSLog(@"index of 'lisi' in range 1~3: %lu", [array indexOfObject:@"lisi" inRange:range]);

    //11.下面两个方法比上面两个方法中比较‘相等’的含义更严格,要求两个对象的地址要一样才表示相等;

    NSLog(@"index of 'lisi': %lu", [array indexOfObjectIdenticalTo:[[Student alloc] initWithAge:21 andWeight:64]]);

    NSLog(@"index of 'lisi' in range 1~3: %lu", [array indexOfObjectIdenticalTo:@"lisi" inRange:range]);

   

    //12.- (BOOL)isEqualToArray:(NSArray *)otherArray;

    //该方法判别参数指定的数组对象是否与接收该消息的数组对象是否相等,判别方式是对两个数组所有对应位置上的元素调用isEqual:,若所有位置都返回YES,两个数组相等;

    NSArray *array2 = @[@"zhaoliu", @"qianqi"];;

    NSLog(@"%d", [array1 isEqualToArray:array2]);

   

    //13.- (NSEnumerator *)objectEnumerator; 返回正向的迭代器;   - (NSEnumerator *)reverseObjectEnumerator;返回反向的迭代器

    // 对于遍历数组或集合中的对象,有四种遍历方式,下标,枚举,快速枚举,block块对象,后面两种方式效率更高。

    NSEnumerator *enumerator = [array objectEnumerator];

    id obj;

    while(obj = [enumerator nextObject]){

        NSLog(@"%@", obj);

    }

    enumerator = [array reverseObjectEnumerator];

    while(obj = [enumerator nextObject]){

        NSLog(@“%@", obj);

    }

   

    //14. - (NSData *)sortedArrayHint;

    //- (NSArray *)sortedArrayUsingFunction:(NSInteger (*)(id, id, void *))comparator context:(void *)context;

    //- (NSArray *)sortedArrayUsingFunction:(NSInteger (*)(id, id, void *))comparator context:(void *)context hint:(NSData *)hint;

    //- (NSArray *)sortedArrayUsingSelector:(SEL)comparator;

    //上面四个方法用来给一个数组排好序返回给一个新数组,不会对原数组造成影响。需要自己传递一个比较器函数,方法执行时,context参数会自动传递给比较器的第三个参数。hint参数即第一个方法的返回值,用来加快排序的速度; 在block块对象出现后,以上方法逐步被下面带block块对象参数的方法取代;原因是block块对象效率更高;

    //- (NSArray *)sortedArrayUsingComparator:(NSComparator)cmptr NS_AVAILABLE(10_6, 4_0);

    //- (NSArray *)sortedArrayWithOptions:(NSSortOptions)opts usingComparator:(NSComparator)cmptr NS_AVAILABLE(10_6, 4_0);

    // NSComparator实际上是一个typedef块对象定义:typedef NSComparisonResult (^NSComparator)(id obj1, id obj2);

   

    //15. - (NSArray *)subarrayWithRange:(NSRange)range;

    //获取一定范围内的子数组,同样是浅复制的

    NSArray *halfArray;

    halfArray = [array subarrayWithRange:NSMakeRange(0, [array count] / 2)];

   

    //16. - (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;

    //- (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)atomically;

    // 这是在OCPractice类中的fileLoadAndSaveTest中测试过的;用于属性列表保存到文件或URL中。第一个参数指定文件或URL路径。第二个参数指定存储过程是原子的还是非原子的;

   

}

posted @ 2014-10-19 22:57  _蚕豆_  阅读(133)  评论(0)    收藏  举报