NSArray使用方法,數組遍曆的幾種方法,迭代器的用法

來源:互聯網
上載者:User

NSArray:

只允許裝OC對象,並且不能裝空值,空代表數組元素的結束
//建立一個空數組
NSArray *array = [NSArray array];
//建立有一個元素的數組
array = [NSArray arrayWithObject:@"123"];
//建立有 多個元素的數組
array = [NSArray arrayWIthObjects:@"a",@"b",nil ];//不能裝nil空值,空值代表數組元素結束
//擷取元素的個數
int count = [array count]; //和 count = array.count; 相同,都是調用get方法
//是否包含一個元素
- (bool) containsObject:(id)anObject;
返回最後一個元素
- (id) lasObject;
//擷取index位置的元素
- (id) objectAtIndex:(NSUInteger) index;
//擷取元素的位置
- (NSUInteger) indexOfObject:(id)anObject;
//在range範圍內尋找元素的位置
- (NSUInteger) indexofObject:(id)anObject inRange:(NSRange)range;
//比較兩個集合內容是否相同
- (Bool) isEqualToArray:(NSArray *)otherArray;
//返回兩個集合中第一個相同的對象元素
- (id) firstObjectCommonWithArray:(NSArray *)otherArray;
//讓集合裡面的所有元素都執行aSelector這個方法
- (void) makeObjectsPerformSelector:(SEL)aSelector;
//讓集合裡面的所有元素都執行aSelector這個方法,給這個方法添加參數,但是只支援一個參數
- (void) makeObjectsPerformSelector:(SEL)aSelector withObject:(id)argument

NSArray:
//添加一個元素,返回一個新的數組(方法調用者本身沒有發生變化)
- (NSArray *) arrayByAddingObject:(id)anObject
//添加otherArray的所有元素,返回一個新的NSArray(方法著本身沒有改變)
- (NSArray *) arrayByAddingObjectsFromArray:(NSArray *) otherArray;
//截取range範圍的數組
- (NSArray *) subarrayWithRange:(NSRenge)range;
//用separator做拼接符,拼接成一個字串
- (NSString *) componentsJoinedByString:(NSString *)separator
//將NSArray持久化到檔案中去
- (Bool) writeToFile:(NSString *)path atomically:(Bool)useAuxiliaryFile

 

數組的記憶體管理;
如果把一個對象放到一個數組裡面,改對象的計數器加一。也就是說數組會對他做一次retain操作
數組被銷毀([array ralease])的時,會對內部所有的元素都做一次release操作
代碼如下:

void * :d代表指向任何類型的指標

數組遍曆:

方法一:普通遍曆

方法二:快速遍曆

方法三:利用block遍曆

方法四:利用迭代器

NSEnumerator迭代器:
集合的迭代器,可以用於遍曆集合元素
NSArray 有相應的方法來擷取迭代器
//擷取一個正序遍曆的迭代器
- (NSEnumerator *) objectEnumerator;
//擷取一個反序遍曆的迭代器
- (NSEnumerator *) reverseObjectEnumerator;

NSEnumerator的常用方法:
//擷取下一個元素
- (id) nextObject;
//擷取所有的元素
- (NSArray *) allObjects

demo代碼如下:
Student.h檔案內容:

#import <Foundation/Foundation.h>

@interface Student : NSObject
+ (id)student;
- (void)test;
- (void)test2:(NSString *)str;
@end

Student.m檔案內容:
#import "Student.h"

@implementation Student
+ (id)student{
    return  [[[Student alloc] init] autorelease];
}
-(void) test{
    NSLog(@"%@ ->test",self);
}
-(void)test2:(NSString *)str{
    NSLog(@"%@->test2 %@",self, str);
}
- (void)dealloc{
    NSLog(@"%@ is destoryed", self);
    [super dealloc];
}
@end

void arrayCreate(){
    //create a null array
  //  NSArray *array = [NSArray array];
   
}

void arrayUse(){
    NSObject *obj = [[NSObject alloc] init];
    NSLog(@"obj:%@",obj);
    NSArray *array = [NSArray arrayWithObjects:@"a", @"b",@"c", obj, nil];
   
    NSString *last = [array lastObject];
    NSLog(@"last :%@",last);
   
    [obj release];
}
#pragma mark memory manager 數組的記憶體管理
void arrayMemory(){
    Student *stu1 = [[Student alloc] init];
    Student *stu2 = [[Student alloc] init];
    Student *stu3 = [[Student alloc] init];

    NSLog(@"stu1:%zi",[stu1 retainCount]); //1
    NSArray *array = [[NSArray alloc] initWithObjects:stu1,stu2,stu3, nil];
   
    NSLog(@"stu1:%zi",[stu1 retainCount]);//2
   
    NSLog(@"array count: %zi",[array count]);
   
    [array release];
    [stu1 release];
    [stu2 release];
    [stu3 release];
   
}
#pragma mark 給數組裡的元素 發送訊息
void arrayMessage(){
    Student *stu1 = [Student student];
    Student *stu2 = [Student student];
    Student *stu3 = [Student student];
   
    NSArray *array = [[NSArray alloc] initWithObjects:stu1,stu2,stu3, nil];

   // [array makeObjectsPerformSelector:@selector(test)];
    //有參數,但是參數只能有一個
    [array makeObjectsPerformSelector:@selector(test2:) withObject:@"123"];
   
    [array  release];
}

#pragma mark 普通遍曆
void arrayFor1(){
    NSArray *array = [NSArray arrayWithObjects:@"1",@"2",@"3",nil];
    int count = array.count;
    for(int i=0; i<count; i++){
        id obj = [array objectAtIndex:i];
        NSLog(@"%i-%@",i, obj);
    }
}

#pragma mark  快速遍曆
void arrayFor2(){
    NSArray *array = [NSArray arrayWithObjects:@"1",@"2",@"3",nil];
    int count = array.count;
    int i=0;
    for(id obj in array){
        NSLog(@"%i-%@",i, obj);
        i++;
    }
}

#pragma mark  利用block遍曆
void arrayFor3(){
    NSArray *array = [NSArray arrayWithObjects:@"1",@"2",@"3",nil];
    [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"%zi->%@",idx, obj);
      //  *stop = YES; //改變外邊的Bool,終止遍曆
    }];
}
#pragma mark 利用迭代器
void arrayFor4(){
    NSArray *array = [NSArray arrayWithObjects:@"1",@"2",@"3",nil];
    NSEnumerator *enumerator = [array objectEnumerator];
    //如果放到遍曆之後,則取到空,原因是,遍曆完了,就沒值了
    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 {
        NSLog(@"------array create--------");
        arrayCreate();
        NSLog(@"------array use-----------");
        arrayUse();
        NSLog(@"------array memory manager----");
        arrayMemory();
      
        NSLog(@"------array message----------");
        arrayMessage();
        NSLog(@"------array for---------");
        arrayFor1();
        NSLog(@"------array for2--------");
        arrayFor2();
        NSLog(@"------array for3---------");
        arrayFor3();
        NSLog(@"------array for4---------");
        arrayFor4();
    }
    return 0;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.