当前位置: 首页 > 编程日记 > 正文

OC中的NSArray和NSMutableArray、NSDictionary和NSMutableDictionary用法

一:NSArray 和NSMutableArray
1: NSArray:不可变数组
NSArray是OC中使用的数组,只能用来存放OC对象,不能存放非OC对象如基本数据类型
它使不可变的,一旦初始化完毕,内容不能改变,也不能添加元素。
而C语言中的数组只能存放一种数据类型
(1) 普通数组的用法
// 普通数组的创建
//        int arr[5] = {1,3,4};// 对象数组的创建
//        Person *p = [[Person alloc] init];
//        Person *arrP[5] = {p, [[Person alloc] init]};

(2):NSArray的创建

        // 0,创建的数组对象永远都是空数组,也就没有任何意义,因为NSArray是不可变的
//        NSArray *arr1 = [NSArray array];// 1, 创建只有一个对象的数组
//        NSArray *arr2 = [NSArray arrayWithObject:p];
//        NSLog(@"%ld", arr2.count); // 结果 1// 2, 创建多了对象的数组,注意nil必须填写,数组元素什么时候结束
//        NSArray *arr3 = [NSArray arrayWithObjects:@"12", @"34", nil];
//        NSLog(@"%ld", arr3.count); //结果:2// 3,快速创建一个NSArray
//        NSArray *arr4 = @[@"12", @"34"];
//        NSLog(@"%@", arr4); // 结果: (12,34)

(3)OC数组的访问

// 获取数组中元素的个数
//        NSArray *arr5 = @[@"hello", @"world", @"china"];
//        NSLog(@"%ld", arr5.count); // 结果 3
//        
//        // 访问数组中指定位置的元素
//        NSString *str = [arr5 objectAtIndex:2];
//        NSLog(@"%@", str); // china
//        
//        // 快速访问数据指定位置的元素值
//        NSString *str2 = arr5[1];
//        NSLog(@"%@", str2); // 结果:world
//        
//        // 查找指定元素的位置
//        NSUInteger index = [arr5 indexOfObject:@"hello"];
//        NSLog(@"index = %ld", index); // 结果 0;// 获取第一个元素
//          id str = [arr5 firstObject];
//          NSLog(@"%@", str);//  获取最后一个元素
//        id  str = [arr5 lastObject];
//        NSLog(@"%@", str);
//        
//        // 判断数组中是否存在摸个元素
//        BOOL b = [arr5 containsObject:@"hello"];
//        NSLog(@"%d", b);

(4)OC数组的遍历

// 1,通过for循环简单遍历
//        NSArray *arr6 = @[@"hello", @"china", @"world"];
////        for (int i = 0; i<arr6.count; i++) {
//            NSLog(@"%@", [arr6 objectAtIndex:i]);
////            NSLog(@"%@", arr6[i]);
////        }
//        
//        // 2,通过for in进行遍历
////        for (NSString *str in arr6) {
////            NSLog(@"%@", str);
////        }
//        
//        // 3,通过数组的方法 Block
//        [arr6 enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
//            if (idx == 1) {
//                *stop = YES;
//            }
//            NSLog(@"%@----%ld", obj, idx);
//        }];/***  这个方法是每遍历到一个元素,就把这个元素还有索引当做一个参数传给Block*/// enumerateObjectsUsingBlock遍历的深入研究,内部是怎么实现的
//        void(^myBlock)(id obj, NSUInteger idx, BOOL *stop) = ^(id obj, NSUInteger idx, BOOL *stop){
//            NSLog(@"%@----%ld", obj, idx);
//            if (idx == 1) {
//                *stop = YES;
//            }
//        };
//        for (int i = 0; i<arr6.count; i++) {
//            
//            id obj = arr6[i];
//            BOOL isStop = NO;
//            myBlock(obj, i, &isStop);
//            if (isStop) {
//                
//                break;
//            }
//        }

(5)OC数组给数组中的所有元素发送消息及带一个参数的消息

Person *p1 = [[Person alloc] init];
//        p1.name = @"张伯伦";
//        
//        Person *p2 = [[Person alloc] init];
//        p2.name = @"乔丹";
//
//        Person *p3 = [[Person alloc] init];
//        p3.name = @"奥尼尔";
//
//        NSArray *arr = @[p1, p2, p3];
//        [arr makeObjectsPerformSelector:@selector(sayHi)];
//        [arr makeObjectsPerformSelector:@selector(say:) withObject:@"你好"];/***  这个方法会向数组中存放的每一个对象发送消息,不过只能有一个参数的消息方法*/

(6)OC数组的文件夹的读取操作:

        // NSArray 只能写入字符串类型的数据,,NSDictionary才可以写对象到文件,在苹果开发中,遇到xml文件,可以把后缀该为.plist,这样就可以使用xcode打开编辑了。
//        NSArray *arr6 = @[@"hello", @"china", @"world"];
//        NSLog(@"%d",[arr6 writeToFile:@"/Users/ll/Desktop/text.plist" atomically:YES]);
//        NSArray *arr = [NSArray arrayWithContentsOfFile:@"/Users/llDesktop/text.plist" ];
//        NSLog(@"%@", arr);

(7)NSString和NSArray

        NSArray *array = @[@"乔丹", @"科比", @"加内特"];// 将数组用一个指定的字符串拼接起来
//        NSString *str = [array componentsJoinedByString:@"NBA"];// 将字符串带⭐️字符串分割成一个数组
//        NSString *str = @"乔丹⭐️科比⭐️加内特";
//        NSArray *array2 = [str componentsSeparatedByString:@"⭐️"];
//        NSLog(@"%@", array2);

2 > NSMutableArray的用法
创建添加删除元素(它是一个可变数组)
        // 创建一个可变数组// 添加元素
//        NSMutableArray *arrM = [NSMutableArray arrayWithObject:@"world"];
//        [arrM addObject:@"hello"];
//        
//        // OC数组不能添加nil对象 错误
////        [arrM addObject:nil];
//        
//        // 删除元素
////        [arrM removeObject:@"hello"];
////        [arrM removeAllObjects];
//          // 删除指定位置的元素
//        [arrM removeObjectAtIndex:1];
//        NSLog(@"%@", arrM);// 替换元素
//        NSArray *array1 = @[@"a", @"b", @"c"];
//        NSMutableArray *arrM = [NSMutableArray arrayWithArray:array1];
//        [arrM replaceObjectAtIndex:1 withObject:@"m"];
//        [arrM exchangeObjectAtIndex:1 withObjectAtIndex:2];
//        NSLog(@"%@", arrM);
注意:
  • NSMutableArray *array = @[@"bob", @"steve", @"john"];

  • [array addObject:@“Peter”];// 错误,使⽤用@[@"bob", @"steve", @"john"]这种⽅方式 创建的永远是NSArray(不可变数组)

  • //正确

  • NSMutableArray *array = [NSMutableArray arrayWithArray:@[@"bob",

    @"steve", @"john"]];

  • [array addObject:@"Peter”];

    二:NSDictionary

    什么是NSDictionary

    ➢ NSDictionary翻译过来叫做”字典”

    ➢ ⽇日常⽣生活中, “字典”的作⽤用: 通过⼀一个拼⾳音或者汉字, 就能找到对应的详细解 释

    ➢ NSDictionary的作⽤用类似: 通过⼀一个key, 就能找到对应的value ➢ NSDictionary是不可变的, ⼀一旦初始化完毕, ⾥里⾯面的内容就⽆无法修改

    1)不可变字典的创建

  •         // 1,创建字典及初始化, 不可变// 没有任何意义
    //        NSDictionary *dic = [NSDictionary dictionary]; //// 创建只有一个键值对的字典
    //        NSDictionary *dic = [NSDictionary dictionaryWithObject:@"yaoming"
    //            forKey:@"ym"];// 创建多个键值对字典
    //        NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"liuxiang", @"lx", @"tianliang", @"tl", nil];//        // 快速创建方法
    //        NSDictionary *dic = @{@"ym":@"yaoming", @"lx":@"liuxiang"};
    //        NSLog(@"%@", dic);

    2)字典的访问

  • // 2,字典访问
    //        NSDictionary *dict = @{@"zs" : @"zhangsan", @"ls" : @"lisi", @"ww" : @"Wangwu"};// 返回字典中的键值数目 count
    //        NSUInteger length = dict.count;// 根据键求值
    //        id str = [dict objectForKey:@"zs"];// 快速访问
    //        id str = dict[@"zs"];
    //        NSLog(@"str = %@", str);

    3)字典的遍历

  •         // 3,字典的遍历
    //        NSDictionary *dict = @{@"zs" : @"zhangsan", @"ls" : @"lisi", @"ww" : @"Wangwu"};// for循环
    //        id key = [dict allKeys]; // 可以知道字典中所有的值
    //        for (int i = 0; i<dict.count; i++) {
    //            
    //            id str = dict[key[i]];
    //            NSLog(@"%@:%@", key[i], str);
    //        }// for in遍历字典中的所有的键
    //        for (NSString  *key in dict) {
    //            
    //            id str = dict[key];
    //            NSLog(@"%@:%@", key, str);
    //        }// Block
    //        [dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
    //            NSLog(@"%@:%@", key, obj);
    //        }];

    4)字典读取文件的操作

  •         // 4,把字典写入到文件
    //        NSDictionary *dict = @{@"zs" : @"zhangsan", @"ls" : @"lisi", @"ww" : @"Wangwu"};
    //        
    //        [dict writeToFile:@"/Users/ll/Desktop/te.plist" atomically:YES];// 用字典读取文件
    //        NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:@"/Users/ll/Desktop/te.plist"];
    //        NSLog(@"%@", dic);
  • 注意:字典中的键不要重复。(虽然重复也不报错,会⾃自动取在前⾯面的那个)

    2,NSMutableDictionary

    • 什么是NSMutableDictionary

    ➢ NSMutableDictionary是NSDictionary的⼦子类

    ➢ NSDictionary是不可变的, ⼀一旦初始化完毕后, 它⾥里⾯面的内容就永远是固定 的, 不能删除⾥里⾯面的元素, 也不能再往⾥里⾯面添加元素

    ➢ NSMutableDictionary是可变的, 随时可以往⾥里⾯面添加\更改\删除元素

    NSMutableDictionary的用法

            // 1,创建一个空的可变字典NSMutableDictionary *dicM = [NSMutableDictionary dictionary];[dicM setObject:@"zhangsan" forKey:@"zs"];// 2,删除指定键值对
    //        [dicM removeObjectForKey:@"zs"];// 3,删除字典中所有内容
            [dicM removeAllObjects];NSLog(@"%@", dicM);/***  注意:@{键:值}创建的字典为不可变字典 ,不用赋值给可变字典及后续操作*/

转载于:https://www.cnblogs.com/-boy/p/4096453.html

相关文章:

java中ContentArea_java中TextArea怎么加载指定路径的文本内容

展开全部这设计到IO操作&#xff0c;很62616964757a686964616fe58685e5aeb931333332643334久以前练手写的加载文本到文本域的界面。具体代码第一步&#xff1a;得到一个File对象&#xff0c;需要参数文本路径File file new File("C:\\test.txt");第二步&#xff1a;…

文本分类技术基础

分类体系 分类&#xff1a;给定一个对象&#xff0c;从一个事先定义好的分类体系中挑出一个或多个最适合该对象的类别。 文本分类(TC, Text Categorization)&#xff1a;在给定的分类体系下&#xff0c;根据文本内容自动的确定文本关联的类别。从数学角度看&#xff0c;文本分类…

C# 返回值为 listT

public List<T> test<T>(List<T> EntityList) where T : class{return EntityList;} 转载于:https://www.cnblogs.com/enych/p/10497312.html

ceph bluestore 源码分析:ceph-osd内存查看方式及控制源码分析

文章目录内存查看内存控制内存控制源码分析通过gperftools接口获取osd进程实际内存 动态设置cache大小动态调整cache比例trim释放内存本文通过对ceph-osd内存查看跟踪的5种手段以及osd内存控制的方式进行源码层面的说明&#xff0c;并未通过修改相关源码进行控制&#xff08;水…

c语言函数库学习~sscanf~格式化输入

---恢复内容开始--- 今天算是被打击到了吧&#xff0c;由郑轻的acm老师来我学院指导安排了个现场的小比赛&#xff0c;&#xff0c;俺们居然有还是输给一个大一的新手&#xff0c;&#xff0c;哎&#xff0c;情何以堪&#xff0c;&#xff0c;所以还是要重视下基础编程能力的培…

java mobile phone games_j2me100-src Java

文件名大小更新时间codesc.net\[J2SE]应用编程150例\chap01\实例1\BorderLayoutDemo.class8192003-07-07codesc.net\[J2SE]应用编程150例\chap01\实例1\BorderLayoutDemo.java5752003-07-07codesc.net\[J2SE]应用编程150例\chap01\实例1\BoxLayoutFrame.class7262003-07-15code…

***突然断开可能是ADSL猫惹的祸

在我们使用服务器的时候&#xff0c;最讨厌的就是无故的断线了&#xff0c;可能正在和好一起副本&#xff0c;或者正在视频热聊中&#xff0c;还或者youtube视频看的正起劲&#xff0c;突然windows一个对话框弹出 - “连接已经断开”。实在是太影响体验了&#xff0c;断开之后&…

文件中数组的最大值及其对应的最小下标

2019年春季学期第二周作业基础作业请在第一周作业的基础上&#xff0c;继续完成&#xff1a;找出给定的文件中数组的最大值及其对应的最小下标&#xff08;下标从0开始&#xff09;。并将最大值和对应的最小下标数值写入文件。 输入&#xff1a;请建立以自己英文名字命名的txt文…

ceph bluestore源码分析:admin_socket实时获取内存池数据

环境&#xff1a; 版本&#xff1a;ceph 12.2.1 部署完cephfs 使用ceph-fuse挂载&#xff0c;并写入数据 关键参数&#xff1a; debug_mempool true 将该参数置为true即可查看详细的blustore管理的内存池的数据 命令&#xff1a; ceph daemon osd.id dump_mempools该命令为ad…

java clob内存溢出_java - java.sql.SQLException:ORA-01704:字符串文字太长时插入或更新 - 堆栈内存溢出...

通常&#xff0c;当我插入4000个字符限制时&#xff0c;它的工作正常&#xff0c;但当超过4000个字符时&#xff0c;它抛出SQL异常字符串文字太长&#xff0c;即使我的DISCHARGE_TEXT数据类型是CLOB我的JavaScript代码是function saveAsDraftNew(){var admissionNo document.g…

LC并联谐振回路

转载于:https://www.cnblogs.com/prayer521/p/4103091.html

zencart分类页产品页去掉url中的id号

最近公司新上的网站被seo指出要修改url&#xff0c;去掉url中产品id。由于我们用的是zencart框架&#xff0c;装了 Ultimate SEO URLs 插件&#xff0c;所以在网上应该有这方面的资料&#xff0c;本文主要参考资料&#xff1a;原网址&#xff1a;修改seo url中去掉产品id的方法…

hexo博客更新主题后上传Git操作

克隆主题: git clone https://github.com/SuperKieran/TKL.git _config.yml文件中主题改为新增主题 # Extensions ## Plugins: https://hexo.io/plugins/ ## Themes: https://hexo.io/themes/ theme: TKL 进入主题目录,更新git cd theme/TKL git pull 执行更新 hexo clean hex…

ceph bluestore源码分析:非对齐写逻辑

文章目录环境原理说明总结环境 ceph:12.2.1 场景&#xff1a;ec 21 部署cephfs&#xff0c;执行如右写模式:dd if/dev/zero of/xxx/cephfs bs6K count4 oflagdirect 关键配置&#xff1a; bluestore_min_alloc_size_hdd 65536 bluestore分配空间的最小粒度 单位&#xff1a;B…

JVM系列(之ClassLoader)

Class Loader Java运作流程 内部class loader bootstrap class loader --引导类加载器&#xff0c;它负责加载Java的核心类【java.* 】&#xff08;如classpath下面的类库&#xff09;&#xff0c;不是 java.lang.ClassLoader的子类&#xff0c;而是由JVM自身实现的。Code . UR…

java平台类成员访问修饰符_JAVA类的修饰符及访问权限

1.类外部类 class前的修饰符只能有publicfinalabstrct无(默认) &#xff1a;同包可见 (Eclipse中选择package)内部类 class前的修饰符有public、protected、private、默认、final、abstract、static。先看类的访问权限&#xff0c;再看成员的访问权限&#xff0c;类…

ios实例开发精品源码文章推荐

1、IOS代码分享:视图布局&#xff08;View Layout&#xff09;Border View140601bvpw22rir88b9i8i.png(19.97 KB, 下载次数: 0)下载附件保存到相册半小时前 上传http://www.apkbus.com/android-101999-1-14.html2、IOS代码分享&#xff1a;导航条&#xff08;Navigation Bar&am…

Spring BeanDefinitionRegistryPostProcessor BeanPostProcessor作用

写博客&#xff0c;写博客&#xff0c;把自己知道的小知识点全部记录&#xff0c;? BeanDefinitionRegistryPostProcessor 接口属于Beanddefination 装配定义的范畴&#xff0c;此时bean 并没有初始化 BeanPostProcessor属于be an 实例化修改的范畴&#xff0c;be an 已经进行…

关于ceph源码 backtrace 打印函数调用栈

当集中精力看一个问题的时候&#xff0c;时间久了就会有这样一个状态&#xff0c;天空飘来五个字&#xff0c;那都不算事 ceph源码庞大的体量以及复杂的设计让很多人望而却步&#xff0c;尤其是大量的纯虚函数更是让读者迷失在代码的海洋&#xff0c;这个时候函数调用栈是一个救…

泛型java 代码讲解_Java泛型详解

2516326-5475e88a458a09e4.png一&#xff0c;打破砂锅问到底泛型存在的意义&#xff1f;泛型类&#xff0c;泛型接口&#xff0c;泛型方法如何定义&#xff1f;如何限定类型变量&#xff1f;泛型中使用的约束和局限性有哪些&#xff1f;泛型类型的继承规则是什么&#xff1f;泛…

(转)金额转中文大写

public class RMB {//返回转换好的大写形式public static String numberToRMB(String money) {return cleanZero(splitNum(roundString(money)));}// 将小写金额转换成大写金额private static String splitNum(String s) {// 如果传入的是空串则继续返回空串if ("".e…

[IOS]UIWebView实现保存页面和读取服务器端json数据

如何通过viewView保存访问过的页面&#xff1f;和如何获取并解析服务器端发送过来的json数据&#xff1f;通过一个简单的Demo来学习一下吧&#xff01; 操作步骤&#xff1a; 1.创建SingleViewApplication应用&#xff0c;新建VIewController&#xff0c;并在xib试图中添加WebV…

struts2之配置文件struts.xml详解

struts配置文件 struts.xml配置参数详解 struts.xml中很大一部分配置默认配置就好了 但是有些还是需要做了解 以便于理解 和修改 <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Str…

ceph bluestore 源码分析:刷缓存(trim)逻辑

环境 ceph版本&#xff1a;12.2.1 部署模式&#xff1a;ec 21 osd&#xff1a; 3个 且资源池已经有数据 执行命令&#xff1a;ceph daemon osd.0 flush_store_cache 进行刷缓存。即将dump_mempools内存池管理的bluestore cache中的无用数据进行释放 主要参数: bluestore_cac…

php中怎么过滤器_PHP 过滤器(Filter)

过滤多个输入表单通常由多个输入字段组成。为了避免对 filter_var 或 filter_input 重复调用&#xff0c;我们可以使用 filter_var_array 或 the filter_input_array 函数。在本例中&#xff0c;我们使用 filter_input_array() 函数来过滤三个 GET 变量。接收到的 GET 变量是一…

c++ Qt向PHP接口POST文件流

Qt调用PHP写的接口&#xff0c;向其传递图片文件&#xff0c;并保存在服务器。 二进制文件无法直接传递&#xff0c;Qt采用Base64进行编码发送&#xff0c;PHP解码保存为文件。 注意&#xff1a;PHP收到数据之后会将POST过来的数据中的加号()替换为空格&#xff0c;造成接收到的…

在网络通讯中应用Protobuf

Protobuf的设计非常适用于在网络通讯中的数据载体&#xff0c;它序列化出来的数据量少再加上以K-V的方式来存储数据&#xff0c;对消息的版本兼容性非常强&#xff1b;还有一个比较大的优点就是有着很多的语言平台支持。下面讲解一下如何在TCP通讯应用中集成Protobuf. Protobuf…

JS中Math函数的常用方法

Math 是数学函数&#xff0c;但又属于对象数据类型 typeof Math > ‘object’ console.dir(Math) 查看Math的所有函数方法。 1&#xff0c;Math.abs() 获取绝对值 Math.abs(-12) 12 2&#xff0c;Math.ceil() and Math.floor() 向上取整和向下取整 console.log(Math.ceil(1…

C++ 泛型编程 -- 函数模版

文章目录定义声明调用方式函数模版的重载函数模版的特点工作中一个同事写了测试demo&#xff0c;想要自己尝试使用发现调用老出错&#xff0c;请教的时候发现是函数模版&#xff0c;有自己的调用方式&#xff0c;并且发现核心代码中大量的函数模版和类模版。特此做一个函数模版…

bellman_ford寻找平均权值最小的回路

给定一个有向图&#xff0c;如果存在平均值最小的回路&#xff0c;输出平均值。 使用二分法求解&#xff0c;对于一个猜测值mid&#xff0c;判断是否存在平均值小于mid的回路 如果存在平均值小于mid的包含k条边的回路&#xff0c;那么有w1w2w3...wk < k * mid,即(w1-mid)(w2…