NSArray是不可变的数组。类似于Java中得ArrayList。
NSArray不能包含基本数据类型的值和nil值,只能包含对象。
其子类NSMutableArray和NSArray方法大致相同,只是前者是可变的,因此相同功能的方法大多没有返回值(因为直接改变了NSMutableArray对象)。
//
// main.m
// NSArray
//
// Created by zzqiltw on 14-5-28.
// Copyright (c) 2014年 zzqiltw. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Student.h"
/*
NSArray不可变数组。
只能包含对象,不能包含基本数据类型如int,也不能包含nil
以nil作为结束的标志
*/
#pragma mark 创建array
void createArray() {
// 创建有一个元素的数组
NSArray *array = [NSArray arrayWithObject:@"haha"];
NSLog(@"%@", array);
// 创建有多个元素的数组
array = [NSArray arrayWithObjects:@"hehe", @"heihei", @"xixi", nil];
NSLog(@"%@", array);
// 计算数组的长度(这里其实是get方法)
int count = [array count];
NSLog(@"%i", count);
}
#pragma mark array用法
void useArray() {
NSArray *array = [NSArray arrayWithObjects:@"hehe", @"heihei", @"xixi", nil];
// 是否包含对象
if ([array containsObject:@"heihei"]) {
NSLog(@"包含!");
} else {
NSLog(@"不包含!");
}
// 得到最后一个对象
NSString *last = [array lastObject];
NSLog(@"最后一个对象是: %@", last);
// 获取第i个元素
NSString *str = [array objectAtIndex:1];
NSLog(@"%@", str);
// 查找元素,返回索引
int i = [array indexOfObject:@"heihei"];
NSLog(@"%i", i);
}
#pragma mark array内存管理(把对象塞进数组它的引用计数器会加1)
void arrayMemory() {
Student *s1 = [[Student alloc] init];
NSLog(@"%zi", [s1 retainCount]);
Student *s2 = [[Student alloc] init];
Student *s3 = [[Student alloc] init];
//把对象塞进数组它的引用计数器会加1, array会对它retain一次
NSArray *array = [[NSArray alloc] initWithObjects:s1, s2, s3, nil];
NSLog(@"%zi", [s1 retainCount]);
// array释放时里面所有的对象都会被release一次
[array release];
NSLog(@"%zi", [s1 retainCount]);
[s1 release];
NSLog(@"%zi", [s1 retainCount]);
[s2 release];
[s3 release];
}
#pragma mark 给数组里的每一个对象发相同消息
void arrayMessage() {
Student *s1 = [Student student];
Student *s2 = [Student student];
Student *s3 = [Student student];
NSArray *array = [NSArray arrayWithObjects:s1, s2, s3, nil];
// 给里面的所有对象调用相同方法。(省去遍历)
[array makeObjectsPerformSelector:@selector(test)];
[array makeObjectsPerformSelector:@selector(test2:) withObject:@"hhh"];
}
#pragma mark - 遍历数组
void travelArray1() {
Student *s1 = [Student student];
NSArray *array = [NSArray arrayWithObjects:s1, @"aaa", @"bbb", @"ccc", nil];
int count = [array count];
for (int i = 0; i < count; ++i) {
id obj = [array objectAtIndex:i];
NSLog(@"%i:%@", i, obj);
}
}
void travelArray2() {
Student *s1 = [Student student];
NSArray *array = [NSArray arrayWithObjects:s1, @"aaa", @"bbb", @"ccc", nil];
// foreach遍历
for (id obj in array) {
NSLog(@"%zi----%@", [array indexOfObject:obj], obj);
}
}
void travelArray3() {
Student *s1 = [Student student];
NSArray *array = [NSArray arrayWithObjects:s1, @"aaa", @"bbb", @"ccc", nil];
// 代码块block遍历(推荐)
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"%zi=%@", idx, obj);
if (idx == 2) {
// 表示停住
*stop = true;
}
}];
}
void travelArray4() {
Student *s1 = [Student student];
NSArray *array = [NSArray arrayWithObjects:s1, @"aaa", @"bbb", @"ccc", nil];
// 迭代器遍历
NSEnumerator *enumerator = [array objectEnumerator];
id obj = nil;
while ((obj = [enumerator nextObject]) != nil) {
NSLog(@"%i->%@", [array indexOfObject:obj], obj);
}
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
// createArray();
// useArray();
// arrayMemory();
// arrayMessage();
// travelArray1();
// travelArray2();
// travelArray3();
travelArray4();
}
return 0;
}