【转】不可变数组NSArray与可变数组NSMutableArray
原文网址:http://www.jianshu.com/p/1ad327f56d1d
不可变数组NSArray
//创建一个空数组
NSArray *array = [NSArray array];
//这样创建是没有意义的.
//创建只有一个元素的数组
NSArray *array1 = [NSArray arrayWithArray:@"a"];
NSArray *array2 = [NSArray arrayWithObject:@"b"];
//使用便利构造器创建有多个元素数组
NSArray *array3 = [NSArray arrayWithObjects:@"Hola",@"Bonjour",@"Guten",@"Tag", nil]; //注意最后有nil
//创建数组,有多个元素 使用对象方法
NSArray *array4 = [[NSArray alloc] initWithObjects:@"1",@"2",@"3", @"4",nil];
//用一个数组创建另一个数组
NSArray *array5 = [NSArray arrayWithArray:array3];
//在控制台打印数组中的所有对象 使用数组名
NSLog(@"%@",array5);
//在控制台打印数组中的某个对象 使用数组名 + 下标法
NSLog(@"%@",array5[0]);
一些常用用法:
NSArray *array = [NSArray arrayWithObjects:@"Hola",@"Guten",@"Tag",@"Bonjour", nil];
//1.获取数组的元素个数 使用count
NSLog(@"%ld",[array count]);
//2.根据下标获取下标对应的对象
NSLog(@"%@",[array objectAtIndex:2]); // 此处[]不能用.代替
//3.通过元素找下标
NSUInteger r = [array indexOfObject:@"three"];
NSLog(@"%ld",r);
//4.判断数组中是否包含了某个元素
BOOL r1 = [array containsObject:@"one"];
if (r1) {
NSLog(@"包含这个元素!");
}else{
NSLog(@"没找着!");
}
简化的创建方式 (语法糖):
NSArray *array = @[@"one",@"two",@"three",@"four"];
简化的访问方式(通过元素下标来访问)
NSString *str = array[2];
NSLog(@"%@",str);
数组遍历:
//第一种方式: 普通遍历 -- 通过下表访问
for (int i = 0; i < array.count; i++) {
NSLog(@"%@",array[i]);
}
//第二种方式: 快速枚举法--for循环的增强版
for (NSString *obj in array) {
NSLog(@"%@",obj);
}
//第三种方式: 使用block进行遍历
[array enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if (idx == 2) { //idx是下标
*stop = YES;
}else{
NSLog(@"下标为:%ld 对象为%@",idx,obj);
}
}];
可变数组NSMutableArray
可变数组NSMutableArray 继承于 不可变数组NSArray
//1.创建一个空数组
NSMutableArray *array =[NSMutableArray array];
//2.维数组追加元素
[array addObject:@1];
//3.创建数组,添加多个元素
NSMutableArray *array2 = [NSMutableArray arrayWithCapacity:5];
//添加5个元素
[array2 addObject:@1];
array2[1] = @2;
array2[2] = @3;
array2[3] = @4;
array2[4] = @5;
//输出数组
NSLog(@"%@",array2);
可变数组有而不可变数组没有的一些操作:
//插入 insert
[array2 insertObject:@6 atIndex:0];
NSLog(@"%@",array2);
//替换 replace
[array2 replaceObjectAtIndex:0 withObject:@0];
NSLog(@"%@",array2);
//删除 remove
[array2 removeLastObject];
NSLog(@"%@",array2);
//是否包含 contain
BOOL r = [array2 containsObject:@2]; //此方法有返回值
if (r) {
NSLog(@"包含!");
} else {
NSLog(@"不包含!");
}
//交换元素 exchange
[array2 exchangeObjectAtIndex:0 withObjectAtIndex:2];
NSLog(@"%@",array2);
一个典型的错误用法:
// NSMutableArray *array =@[@1,@2,@3,@4,@5];
// [array addObject:@"hello"];
// NSLog(@"%@",array3);
注: 语法糖是为不可变对象设立的,如果创建可变对象时,使用语法糖,会报黄,创建之后,再为此空间添加对象,程序会抛出异常,因为在运行时,默认是不可变的数组.
原文链接:http://www.jianshu.com/p/1ad327f56d1d
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
【转】不可变数组NSArray与可变数组NSMutableArray的更多相关文章
- OC基础 可变数组与不可变数组的使用
OC基础 可变数组与不可变数组的使用 1.不可变数组 1.1不可变数组的创建 //实例方法 NSArray *array = [[NSArray alloc] initWithObjects:&quo ...
- Chapter5_初始化与清理_数组初始化与可变参数列表
一.数组初始化 数组是相同类型的,用一个标识符名称封装到一起的一个对象序列或基本类型数据序列.编译器是不允许指定数组的长度的,当使用语句int[] a时,拥有的只是一个符号名,即一个数组的引用,并不拥 ...
- scala (4) 可变数组和不可变数组
在scala中数组分为不可变长数组(在immutable包下)和可变长数组(在mutable包下) 不可变长数组指的是长度不可变,但是数组中角标对应的元素的值是可变的 可变数组指的是长度和数组中角标对 ...
- Java基础语法04面向对象上-类-属性-方法-可变参数-重载-递归-对象数组
类 面向对象是一种思想,一般指将事务的属性与方法抽出总结为模板(类/class),处理事务时通过类创建/new出对象由对象的功能/方法去完成所要计算处理的事情. 面向过程:POP:以过程,步骤为主,考 ...
- iOS之利用runtime,避免可变数组和可变字典为nil或者数组越界导致的崩溃
NSArray.NSMutableArray.NSDictionary.NSMutableDictionary.是我们的在iOS开发中非常常用的类.当然,在享受这些类的便利的同时,它们也给我们带来一些 ...
- Foundation框架—— 数组 (NSArray NSMutableArray )
基础知识回顾 1.在给可变数组添加元素时,要保证该数组已被初始化 2.在遍历可变数组时,不能对其进行增删改 3.NSMutableArray继承自NSArray,几乎拥有NSArray的一切方法. 4 ...
- 15.Object-C--浅谈Foundation框架OC数组NSArray与NSMutableArray
昨天总结了一下NSString与NSMutableString,今天我在这里总结一下NSArray与NSMutableArray. NSArray数组是:不可变数组. nil 是数组元素结束的标记.O ...
- Object-C,数组NSArray
晚上回来,写了2个iOS应用程序. 就是在界面中,展示标签.一种是手动构造界面,然后绑定事件.另外一种是,使用自带的界面作为容器,但是手动向里面放其它界面元素. 书中的观点是,使用图形化界面,构造界面 ...
- IOS数组NSArray与NSMutableArray知识点
此文是对数组NSArray与NSMutableArray知识点的总结,主要是一些常见的操作,别外一些操作见其相应的文档,下面的代码部分还运用的第三方插件BlocksKit相结合: a:Foundati ...
随机推荐
- ExtJS之Ext.getDom
<!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv ...
- MySQL5.6 Replication主从复制(读写分离) 配置完整版
MySQL5.6 Replication主从复制(读写分离) 配置完整版 MySQL5.6主从复制(读写分离)教程 1.MySQL5.6开始主从复制有两种方式: 基于日志(binlog): 基于GTI ...
- Swift 使用CollectionView 实现图片轮播封装就是这样简单
前言: 这篇你可以学会自定义视图,创建collectionView,协议的使用,定时器; 自制图片 先上Demo:Github上封装好的下载即用, 好用请Star Thanks首先新建一个继承于UIV ...
- Android中级之网络数据解析一之xml解析
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! --Comic Sans MS Xml解析具有跨平台性,语言无关性,易操作性,因此广受开发者的欢迎. ...
- C 语言文件操作
C 语言文件操作 1. 数据流: 程序与数据的交互以流的形式进行.fopen 即打开数据流,fclose 即刷新数据流. 所谓数据流,是一种抽象,表示这段数据像流一样,需要逐步接收,不 ...
- C# const与static的理解
C# const与static的理解 static readonly与 const变量,作用是一样的,无论访问修饰符是不是public,还是其它(private. protected.interna ...
- Regex 字符是不是汉字
Regex 字符是不是汉字 一. 判断一个字符是不是汉字通常有三种方法: 1.用ASCII码判断 在 ASCII码表中,英文的范围是0-127,而汉字则是大于127 string text = & ...
- js判断是移动端还是pc端
运行页面的时候,执行到js会判断来自于移动端还是pc端,如果是移动端则跳转制定链接地址,这样在手机端会有额外的不必要浪费的加载时间 var browser={ versions:function(){ ...
- ubuntu装机后的一些零散配置
-2 以root用户登录 su passwd root 可参考http://blog.csdn.net/happyteafriends/article/details/7518893 : 先设定一个r ...
- 头文件中的#ifndef/#define/#endif 的作用
在一个大的软件工程里面,可能会有多个文件同时包含一个头文件,当这些文件编译链接成一个可执行文件时,就会出现大量重定义的错误.在头文件中实用#ifndef #define #endif能避免头文件的重定 ...