OC不可变数组NSArray详解

2024-08-28 16:38
文章标签 数组 详解 不可 oc nsarray

本文主要是介绍OC不可变数组NSArray详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、NSSArray(子类NSMutableArray)  、NSSet(子类NSMutableSet)、  NSDictionary(子类NSMutableDictionary)这几个类都是集合类。
2、c语言类型的数组只能存放一种类型的数据。为此引入OC数组NSArray,以面向对象的方法操作数据,可以存放各种类型的对象。(只能存放OC对象,不能存放非OC对象类型,例如基本数据类型,结构体,枚举都不能存放)。
3、OC数组分类:OC数组也分为可变(NSArray)   ,不可变(NSMutableArray)。 可变是指:数组内的数据可可以经数组操作进行改变。不可变数组是指:内容在创建数组的同时指定,数组创建以后以后将永远不可以再改变。例如 NSArray *array=[NSarray array] ;创建了一个没指定内容的空数组,那么array以后永远是空数组,永远无法改变。也就是说NSArray数组的元素必须在创建数组时就要进行初始化。
4、不可变数组NSArray的使用方式:
(1)使用类方法arrayWithObjects创建数组,举例如下:
NSArray *array=[NSArray arrayWithObjects:@“Jack”,@“rose”,nil];切记:使用arrayWithObjects方法时在最后一个对象的后面一定要加nil空指针。它是数组结束的标志,在nil之前的元素都是数组的内容。
(2)NSArray不可以存放空值即nil,nil只能有一个且只能放在末尾作为数组结束的标志。NSArray只可以存放OC对象类型。
(3)如果NSArray对象的内部只存放一个对象的话,结尾不用加nil指针作为结束标志,只有在存放两个以及多个对象数据时才加nil。
5、不可变数组NSArray自带的方法:
(1)返回存放的元素个数。NSArray对象可以调用自身的count方法返回数组自己内部对象数据的个数。可以用[NSArray对象  count]或NSArray对象.count  直接返回个数值。
(2)返回指定下标位置的对象。第一种方式可以用objectAtIndex方法。用[NSArray对象 objectAtIndex:位置下标]返回一个OC对象。第二种方式直接用C语言数组的格式  即NSArray对象[位置下标]
就可返回指定位置的对象,假设NSArray对象为array,array[4];
(3)根据对象返回下标位置。方法:indexOfObject:obj 即找出obj元素在数组中的下标。
(4)快速创建一个NsArray对象。用arrayWithObjects方法过于麻烦,可以直接用NSArray *array=@[@“Jack”,@“rose”,nil];代替即可,此种方式不需要加nil。注意若不用arrayWithObjects方法创建则不用加结束标志nil。
6、NSArray数组的遍历:
(1)一般方式:NSArray *array=@[@“Jom”,@“Rose”];
for(int i=0; i<array.count; i++){
   NSLog(@“%@”,array[i]);
}
(2)快速遍历方式:
for(id obj in array){
   NSLog(@“%@”,obj);
}
id obj代表着数组中的每一个元素,
注意:第二种方式缺点是不知道元素遍历的是第几次,若想知道当前遍历的元素是第几次,若想知道是第几次就要在外部初始化一个值为零的计数器进行内部计数或使用根据对象获取下标的方法。
如下所示:
int count=0;
for(id obj in array){
    NSLog(@“%@”,);
}或
for(id obj in array){
  NSUInteger i=[array indexOfObject: obj];
NSLog(@“%ld - %@”,i,obj);
}
(3)传入block方法遍历:用enumerateObjectsUsingBlock方法并传入一个block变量,直接编辑即可。如下所示:
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            
 }]
注意:每遍历一个元素,就会调用一次block,并且当前元素和索引位置元素当做参数传给block。obj:当前遍历的元素对象。idx:当前遍历元素的下标。stop:BOOL类型指针,当*stop被赋值为YES时,就会停止遍历,即

*stop=YES就相当于C语言for或switch中的break关键字。

7、全部打印对象元素:直接打印数组对象即可;即NSLog(@"%@",array); // array 为NSArray类型数组

代码验证,实例如下:

//
//  main.m
//  NSArrayExample
//
//  Created by apple on 15/8/20.
//  Copyright (c) 2015年 liu. All rights reserved.
//#import <Foundation/Foundation.h>
void Test1()
{//   验证创建NSArray的方法//  方式1:使用arrayWithObjectsNSArray *array1 = [NSArray arrayWithObjects:@"Jack",@"Tom",@"Jim", nil];NSArray *array2 = @[@"JACK",@"TOM",@"JIM"]; // 方式二//根据对象返回下标unsigned long int index1 = [array1 indexOfObject:@"Tom"];//   根据下标返回对象NSString *obj = [array2 objectAtIndex:2];//  返回元素的个数unsigned long int num=[array1 count]; //   或array.countNSLog(@"index1=%ld  obj=%@ num=%ld",index1,obj,num);}
void Test2()
{//  NSArray的几种遍历方式NSArray *array=[NSArray arrayWithObjects:@"AAA",@"BBB",@"CCC", nil];//  第一种:普通方式for(int i=0;i<array.count;i++){NSLog(@"i=%d %@",i,array[i]); // 或[array objectAtIndex: i];}NSLog(@"-------------------");//  第二种:快速遍历for(id obj in array){  // 获取下标方式一NSLog(@"index=%ld  %@",[array indexOfObject:obj],obj);}int count=0;for(id obj in array){ // 获取下标方式二NSLog(@"count=%d  %@",count,obj);count++;}NSLog(@"-------------------");// 第三种:传入块变量[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {NSLog(@"id =%ld obj=%@ ",idx,obj);if (idx==1) {*stop=YES; // 终止遍历}}];NSLog(@"-------------------");NSLog(@"%@",array);  //打印所有对象元素
}
int main(int argc, const char * argv[])
{@autoreleasepool {Test1();Test2();}return 0;
}


运行结果如下:















这篇关于OC不可变数组NSArray详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1115314

相关文章

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

MySQL中的分组和多表连接详解

《MySQL中的分组和多表连接详解》:本文主要介绍MySQL中的分组和多表连接的相关操作,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录mysql中的分组和多表连接一、MySQL的分组(group javascriptby )二、多表连接(表连接会产生大量的数据垃圾)MySQL中的

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

SpringBoot3.4配置校验新特性的用法详解

《SpringBoot3.4配置校验新特性的用法详解》SpringBoot3.4对配置校验支持进行了全面升级,这篇文章为大家详细介绍了一下它们的具体使用,文中的示例代码讲解详细,感兴趣的小伙伴可以参考... 目录基本用法示例定义配置类配置 application.yml注入使用嵌套对象与集合元素深度校验开发

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

SpringBoot整合mybatisPlus实现批量插入并获取ID详解

《SpringBoot整合mybatisPlus实现批量插入并获取ID详解》这篇文章主要为大家详细介绍了SpringBoot如何整合mybatisPlus实现批量插入并获取ID,文中的示例代码讲解详细... 目录【1】saveBATch(一万条数据总耗时:2478ms)【2】集合方式foreach(一万条数

Python装饰器之类装饰器详解

《Python装饰器之类装饰器详解》本文将详细介绍Python中类装饰器的概念、使用方法以及应用场景,并通过一个综合详细的例子展示如何使用类装饰器,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. 引言2. 装饰器的基本概念2.1. 函数装饰器复习2.2 类装饰器的定义和使用3. 类装饰

MySQL 中的 JSON 查询案例详解

《MySQL中的JSON查询案例详解》:本文主要介绍MySQL的JSON查询的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 的 jsON 路径格式基本结构路径组件详解特殊语法元素实际示例简单路径复杂路径简写操作符注意MySQL 的 J