天天看點

OC之【NSArray使用】

#import <Foundation/Foundation.h>

#import "Student.h"

#pragma mark 建立一個數組

void arrayCreate() {

    // 建立一個空的數組

    NSArray *array = [NSArray array];

    // 建立有1個元素的數組

    array = [NSArray arrayWithObject:@"123"];

    // 建立有多個元素的數組

    array = [NSArray arrayWithObjects:@"a", @"b", @"c", nil];

    int count = [array count];

    // count = array.count;

    NSLog(@"%i", count);

}

#pragma mark 數組的簡單使用

void arrayUse() {

    NSObject *obj = [[NSObject alloc] init];

    NSArray *array = [NSArray arrayWithObjects:@"a", @"b", @"c" , obj, nil];

    // 判斷是否包含了某個元素

    if ([array containsObject:@"a"]) {

        NSLog(@"包含了字元串a");

    }

    NSString *last = [array lastObject];

    NSLog(@"last=%@", last);

    NSString *str = [array objectAtIndex:1];

    NSLog(@"%@", str);

    int index = [array indexOfObject:@"c"];

    NSLog(@"index=%i", index);

    [obj release];

}

#pragma mark 數組的記憶體管理

void arrayMemory() {

    // 1

    Student *stu1 = [[Student alloc] init];

    Student *stu2 = [[Student alloc] init];

    Student *stu3 = [[Student alloc] init];

    NSLog(@"stu1:%zi", [stu1 retainCount]);

    // 當把一個對象塞進數組中時,這個對象的計數器會加1,也就是說數組會對它做一次retain操作

    // 2

    NSArray *array = [[NSArray alloc] initWithObjects:stu1, stu2, stu3, nil];

    NSLog(@"stu1:%zi", [stu1 retainCount]);

    NSLog(@"count=%zi", array.count);

    // 1

    [stu1 release];

    [stu2 release];

    [stu3 release];

    // 數組被銷毀的時候,會對内部的所有元素都做一次release操作

    // 0

    [array release];

}

#pragma mark 給數組裡面的元素發送消息

void arrayMessage() {

    Student *stu1 = [Student student];

    Student *stu2 = [Student student];

    Student *stu3 = [Student student];

    NSArray *array = [NSArray arrayWithObjects:stu1, stu2, stu3, nil];

    // 讓數組裡面的所有對象都調用test方法

    // [array makeObjectsPerformSelector:@selector(test)];

    [array makeObjectsPerformSelector:@selector(test2:) withObject:@"123"];

}

#pragma mark 周遊數組1

void arrayFor1() {

    Student *stu1 = [Student student];

    NSArray *array = [NSArray arrayWithObjects:stu1, @"1", @"2", @"3", nil];

    int count = array.count;

    for (int i = 0; i<count; i++) {

        // id == void *

        id obj = [array objectAtIndex:i];

        NSLog(@"%i-%@", i, obj);

    }

}

#pragma mark 周遊數組2

void arrayFor2() {

    Student *stu1 = [Student student];

    NSArray *array = [NSArray arrayWithObjects:stu1, @"1", @"2", @"3", nil];

    // 快速周遊

    int i =0;

    for (id obj in array) {

        NSLog(@"%i-%@", i, obj);

        i++;

    }

}

#pragma mark 周遊數組3

void arrayFor3() {

    Student *stu1 = [Student student];

    NSArray *array = [NSArray arrayWithObjects:stu1, @"1", @"2", @"3", nil];

    [array enumerateObjectsUsingBlock:

     ^(id obj, NSUInteger idx, BOOL *stop) {

        NSLog(@"%i-%@", idx, obj);

         // 如果索引為1,就停止周遊

         if (idx == 1) {

             // 利用指針修改外面BOOL變量的值

             *stop = YES;

         }

    }];

}

#pragma mark 周遊數組4

void arrayFor4() {

    Student *stu1 = [Student student];

    NSArray *array = [NSArray arrayWithObjects:stu1, @"1", @"2", @"3", nil];

    // 擷取數組的疊代器

    // NSEnumerator *enumerator = [array objectEnumerator];

    // 反序疊代器(從尾部開始周遊元素)

    NSEnumerator *enumerator = [array reverseObjectEnumerator];

    // allObjects是取出沒有被周遊過的對象

    NSArray *array2 = [enumerator allObjects];

    NSLog(@"array2:%@", array2);

    // 擷取下一個需要周遊的元素

    id obj = nil;

    while (obj = [enumerator nextObject]) {

        NSLog(@"obj=%@", obj);

    }

}

int main(int argc, const char * argv[])

{

    @autoreleasepool {

        arrayFor4();

    }

    return 0;

}