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

相关文章

Java利用@SneakyThrows注解提升异常处理效率详解

《Java利用@SneakyThrows注解提升异常处理效率详解》这篇文章将深度剖析@SneakyThrows的原理,用法,适用场景以及隐藏的陷阱,看看它如何让Java异常处理效率飙升50%,感兴趣的... 目录前言一、检查型异常的“诅咒”:为什么Java开发者讨厌它1.1 检查型异常的痛点1.2 为什么说

MySQL的配置文件详解及实例代码

《MySQL的配置文件详解及实例代码》MySQL的配置文件是服务器运行的重要组成部分,用于设置服务器操作的各种参数,下面:本文主要介绍MySQL配置文件的相关资料,文中通过代码介绍的非常详细,需要... 目录前言一、配置文件结构1.[mysqld]2.[client]3.[mysql]4.[mysqldum

springboot2.1.3 hystrix集成及hystrix-dashboard监控详解

《springboot2.1.3hystrix集成及hystrix-dashboard监控详解》Hystrix是Netflix开源的微服务容错工具,通过线程池隔离和熔断机制防止服务崩溃,支持降级、监... 目录Hystrix是Netflix开源技术www.chinasem.cn栈中的又一员猛将Hystrix熔

Java调用Python脚本实现HelloWorld的示例详解

《Java调用Python脚本实现HelloWorld的示例详解》作为程序员,我们经常会遇到需要在Java项目中调用Python脚本的场景,下面我们来看看如何从基础到进阶,一步步实现Java与Pyth... 目录一、环境准备二、基础调用:使用 Runtime.exec()2.1 实现步骤2.2 代码解析三、

python之uv使用详解

《python之uv使用详解》文章介绍uv在Ubuntu上用于Python项目管理,涵盖安装、初始化、依赖管理、运行调试及Docker应用,强调CI中使用--locked确保依赖一致性... 目录安装与更新standalonepip 安装创建php以及初始化项目依赖管理uv run直接在命令行运行pytho

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

MySQL中REPLACE函数与语句举例详解

《MySQL中REPLACE函数与语句举例详解》在MySQL中REPLACE函数是一个用于处理字符串的强大工具,它的主要功能是替换字符串中的某些子字符串,:本文主要介绍MySQL中REPLACE函... 目录一、REPLACE()函数语法:参数说明:功能说明:示例:二、REPLACE INTO语句语法:参数

redis数据结构之String详解

《redis数据结构之String详解》Redis以String为基础类型,因C字符串效率低、非二进制安全等问题,采用SDS动态字符串实现高效存储,通过RedisObject封装,支持多种编码方式(如... 目录一、为什么Redis选String作为基础类型?二、SDS底层数据结构三、RedisObject

springboot整合mqtt的步骤示例详解

《springboot整合mqtt的步骤示例详解》MQTT(MessageQueuingTelemetryTransport)是一种轻量级的消息传输协议,适用于物联网设备之间的通信,本文介绍Sprin... 目录1、引入依赖包2、yml配置3、创建配置4、自定义注解6、使用示例使用场景:mqtt可用于消息发

Python Flask实现定时任务的不同方法详解

《PythonFlask实现定时任务的不同方法详解》在Flask中实现定时任务,最常用的方法是使用APScheduler库,本文将提供一个完整的解决方案,有需要的小伙伴可以跟随小编一起学习一下... 目录完js整实现方案代码解释1. 依赖安装2. 核心组件3. 任务类型4. 任务管理5. 持久化存储生产环境