Student.h:

#import <Foundation/Foundation.h>

@interface Student : NSObject
+(id)student;
-(void)test;
@end



Student.m:

#import "Student.h"

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



main:

#import <Foundation/Foundation.h>
#import "Student.h"
void arrayCreate(){
    //静态创建数组,a不需要我们管理内存
    NSArray *array=[NSArray array];
    array = [NSArray arrayWithObject:@"abc"];
    array=[NSArray arrayWithObjects:@"d",@"e",@"f",nil];
    NSLog(@"%@",array);
    NSLog(@"数组的元素个数:%zi",[array count]);
}

void arrayUse(){
    NSArray *obj=[[[NSArray alloc] init] autorelease];
    NSArray *array=[NSArray arrayWithObjects:@"a",@"b",@"c",obj,nil];
    if([array containsObject:@"a"]){
        NSLog(@"数组中包含了a元素");
    }

    NSLog(@"最后一个元素是:%@",[array lastObject]);

    NSLog(@"第2个元素是:%@",[array objectAtIndex:1]);

    NSLog(@"c元素的位置:%zi",[array indexOfObject:@"c"]+1);
}
#pragma mark - 数组的内存管理
void arrayMemory(){
    Student *stu1=[[Student alloc] init];
    Student *stu2=[[Student alloc] init];
    Student *stu3=[[Student alloc] init];
    NSLog(@"stu1的计数器%i",[stu1 retainCount]);
    //注意:将一个OC对象塞给array之后,这个对象的计数器加1
    NSArray *array=[[NSArray alloc] initWithObjects:stu1,stu2,stu3,nil]; //注意:将一个OC对象塞给array之后,这个对象的计数器加1
    NSLog(@"stu1的计数器%i",[stu1 retainCount]);
    NSLog(@"元素个数:%zi",array.count);

    [stu1 release];
    [stu2 release];
    [stu3 release];
    [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];//静态方法不需要我们管理内存
    //将array里面多有对象都调用一次test方法
    //[array makeObjectsPerformSelector:@selector(test)];
    [array makeObjectsPerformSelector:@selector(test:) withObject:@"123"];  //注意冒号也是方法名的一部分,这个顶多只支持传一个参数
}

#pragma mark - 遍历数组1(基本for循环遍历)
void arrayFor1(){
    Student *stu1=[Student student];
    NSArray * array=[NSArray arrayWithObjects:@"1",@"2",@"3",stu1,nil];//任何OC对象都可以塞进数组中
    int count=array.count; //得到数组的元素个数
    for(int i=0;i<count;i++){ //返回id
        id obj=[array objectAtIndex:i];    //id=void *
        NSLog(@"%->%@",i,obj);
    }
}
#pragma mark - 遍历数组2(快速遍历)
void arrayFor2(){
    Student *stu1=[Student student];
    NSArray * array=[NSArray arrayWithObjects:@"1",@"2",@"3",stu1,nil];//任何OC对象都可以塞进数组中
    //快速遍历
    int i=0;
    for(id obj in array){
        NSLog(@"%->%@",i,obj);
        i++;
    }
}
#pragma mark - 遍历数组3(用Block遍历)
void arrayFor3(){
    Student *stu1=[Student student];
    NSArray * array=[NSArray arrayWithObjects:@"1",@"2",@"3",stu1,nil];//任何OC对象都可以塞进数组中
    //用Block遍历
    [array enumerateObjectsUsingBlok:^(id obj,NSUinter idx,BOOL *stop){
        NSLog(@"%i-%@",idx,obj);
        if(idx==2){
            //利用指针变量修改外面BOOL的值
            *stop=YES;//调用指针参数   改变外面的变量   终止循环
        }
    }];
    
}
#pragma mark - 遍历数组4(用迭代器遍历)
void arrayFor4(){
    Student *stu1=[Student student];
    NSArray * array=[NSArray arrayWithObjects:@"1",@"2",@"3",stu1,nil];//任何OC对象都可以塞进数组中
    //用迭代器遍历数组
    //获取数组的迭代器
    NSEnumerator *enumerator=[array objectEnumerator];
//    //取得下一个对象
//    [enumerator nextObject];
    id obj=nil;
    if(obj=[enumerator nextObject]){
        NSLog(@"obj=%@",obj);
    }
//    //返回迭代器中所有的元素
//    [array allObjects];
    //注意:这个方法只能返回没由遍历过的,要使用这种方法返回所有的对象,就放在nextObject方法之前!!!
    NSArray * array2=[array allObjects];
    NSLog(@"array2:%@",array2);
}
int main(int argc, const char * argv[])
{

    @autoreleasepool {
        
        arrayCreate();
        arrayUse();
        arrayMemory();
        arrayFor1();
        arrayFor2();
        arrayFor3();
        arrayFor4();
    }
    return 0;
}