【转】不可变数组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 ...
随机推荐
- hdu 2999 Stone Game, Why are you always there? 博弈论
SG函数应用!! 代码如下: #include<cstdio> #include<cstring> #include<iostream> #include<c ...
- http://www.cnblogs.com/leiOOlei/p/5075402.html
http://www.cnblogs.com/leiOOlei/p/5075402.html
- 深入理解MVC与MVP
http://www.cnblogs.com/seaky/archive/2011/04/06/1982533.html 在深入分析MVC和MVP之前,我们有必要回顾下经典的三层架构.分层是计算机学科 ...
- Python模块包中__init__.py文件的作用
转载自:http://hi.baidu.com/tjuer/item/ba37ac4ce7482a0f6dc2f08b 模块包: 包通常总是一个目录,目录下为首的一个文件便是 __init__.py. ...
- DB2中字符、数字和日期类型之间的转换
DB2中字符.数字和日期类型之间的转换 一般我们在使用DB2或Oracle的过程中,经常会在数字<->字符<->日期三种类 型之间做转换,那么在DB2和Oracle中,他们分别 ...
- Android 使用全局变量传递数据
使用全局变量传递数据,所谓的全局变量类似于jee开发中的application变量.申明后,全局调用.只有当内存被清理后,才被销毁.否则一直可以调用. 还是使用点击一个button,传递一个数据到另一 ...
- .NET在EF中使用sql,用动态类吧!
.NET在EF中使用sql,用动态类吧! 前言 在.NET中使用Entity Framework能快速.方便地结合LINQ来对数据库进行一系列的增删改查操作.但是由于EF根据表达式最后生成通用的sql ...
- js 去空格函数与正则
如果项目没有用到jQuery等框架的话,js本身又没有这样的函数,我们不得不自己写这样的函数,下面是函数的具体实现: //供使用者调用 function trim(s){ return trimRig ...
- Codeforces Round #362 (Div. 2) A.B.C
A. Pineapple Incident time limit per test 1 second memory limit per test 256 megabytes input standar ...
- c#开源Excel操作库--NPOI
前言 以前也用C#操作过excel,用的是OleDb或者offic的com组件,但是总是非常的麻烦,依赖限制较多,所以果断寻找开源方案,JAVA上面已经有非常成熟的POI,就这样,找到了移.Net的移 ...