首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Objective C中有一个类似NSArray,NSDictionary等类的可变和不可变版本的逻辑是什么?

在Objective-C中,类似于NSArray、NSDictionary等类的可变和不可变版本的逻辑是基于对象的可变性和不可变性。

首先,Objective-C中的集合类(如NSArray、NSDictionary、NSSet等)有可变和不可变两种版本。可变版本的类名以“NSMutable”开头,如NSMutableArray、NSMutableDictionary、NSMutableSet等。

其次,不可变版本的集合类(如NSArray、NSDictionary、NSSet等)在创建后,其内容是不能被修改的。这意味着,如果你想要修改一个不可变集合,你需要创建一个新的集合,并将原集合的内容复制到新集合中进行修改。

可变版本的集合类(如NSMutableArray、NSMutableDictionary、NSMutableSet等)则允许在创建后对其内容进行修改。这意味着,你可以直接对可变集合进行添加、删除、修改等操作,而无需创建新的集合。

在Objective-C中,可变和不可变版本的集合类之间的转换是相对简单的。你可以使用以下方法将不可变版本的集合类转换为可变版本的集合类:

  • NSArray 转换为 NSMutableArray:
代码语言:txt
复制
NSArray *immutableArray = @[@1, @2, @3];
NSMutableArray *mutableArray = [immutableArray mutableCopy];
  • NSDictionary 转换为 NSMutableDictionary:
代码语言:txt
复制
NSDictionary *immutableDictionary = @{@"key1": @"value1", @"key2": @"value2"};
NSMutableDictionary *mutableDictionary = [immutableDictionary mutableCopy];
  • NSSet 转换为 NSMutableSet:
代码语言:txt
复制
NSSet *immutableSet = [NSSet setWithObjects:@1, @2, @3, nil];
NSMutableSet *mutableSet = [immutableSet mutableCopy];

同样,你也可以使用以下方法将可变版本的集合类转换为不可变版本的集合类:

  • NSMutableArray 转换为 NSArray:
代码语言:txt
复制
NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@1, @2, @3, nil];
NSArray *immutableArray = [NSArray arrayWithArray:mutableArray];
  • NSMutableDictionary 转换为 NSDictionary:
代码语言:txt
复制
NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil];
NSDictionary *immutableDictionary = [NSDictionary dictionaryWithDictionary:mutableDictionary];
  • NSMutableSet 转换为 NSSet:
代码语言:txt
复制
NSMutableSet *mutableSet = [NSMutableSet setWithObjects:@1, @2, @3, nil];
NSSet *immutableSet = [NSSet setWithSet:mutableSet];

总之,在Objective-C中,可变和不可变版本的集合类之间的转换非常简单,而且可以根据实际需要进行选择。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

iOS开发之__NSArray0、__NSArrayI、__NSArrayM和__NSPlaceholderArray

Class Clusters 首先说一下Class Clusters(类簇)是抽象工厂模式在iOS下的一种实现,iOS中如NSString、NSArray、NSDictionary以及NSNumber都运作在这一模式下...NSArray的类簇 在《effective objective-c 2.0编写高质量iOS与OS X代码的52个有效方法》中这样写道:系统框架中有许多类簇,大部分collection类都是类族。...例如NSArray与其可变版本NSMutableArray。这样看来实际上有两个抽象基类,一个用于不可变数组,一个用于可变数组。尽管具备公共接口的类有两个,但任然可以合起来算一个类族。...两个类共同属于同一个类族,这意味着二者在实现各自类型的数组时可以共用实现代码,此外还能把可变数组复制成不可变数组,反之亦然。...//will be hit } 言归正传,下面我们来说说__NSArray0、__NSArrayI、__NSArrayM和__NSPlaceholderArray到底是什么鬼。

3K80

Foundation framework in iOS

objective-c不像CSharpe有一个标准库 他的标准有很多,想象一下近40年前的编程语言 他都经历了什么,因为早期objective-c的一套工具库是乔老头子出走时Next-step公司写的,...二者在类型上是不同的,但是存储的字符串是可以做对比的。 NSMutbaleString就有点类似C#的StringBuild这个类,可以做一些字符串的增删改操作。...NSArray是不可变的,NSMutableArray是可变的。二者在类型上是不同的。如果需要操作数组还是用NSMutableString,这个版本的array。...3、NSNumber、NSArray、NSDictionary和NSData之间的转换 数组转NSData是建立在归档的基础上,归档也称为序列化,OC中NSString 对象、NSNumber...使用文件操作: objective-c通过使用NSFileManager类来管理和操作文件、目录,NSFileManager,文件或目录是使用文件的路径名的唯一标示。

6910
  • 《Effective Objective-C》干货三部曲(二):规范篇

    继上一篇《Effective Objective-C 》干货三部曲(一):概念篇之后,本篇即是三部曲的第二篇:规范篇。本篇归纳讲解的是书中有关Objective-C开发的规范性知识。...该三部曲系列是由笔者将《Effective Objective-C 》这本书的52个知识点分为三大类进行了归类整理而成: 概念类:讲解了一些概念性知识。...这样一来,当在外部获取这个属性时,获取的只是内部可变型的一个不可变版本,例如: 在公共API中: @interface EOCPerson : NSObject @property (nonatomic...因此,外部读取到的set都将是不可变的版本。 等一下,有个疑问: 在公共接口设置不可变set 和 将增删的代码放在公共接口中是否矛盾的? 答案:并不矛盾!...NSDictionary,和NSet时,我们又新创建了一个数组。

    82610

    《Effective Objective-C》干货三部曲(二):规范篇

    继上一篇《Effective Objective-C 》干货三部曲(一):概念篇之后,本篇即是三部曲的第二篇:规范篇。本篇归纳讲解的是书中有关Objective-C开发的规范性知识。...该三部曲系列是由笔者将《Effective Objective-C 》这本书的52个知识点分为三大类进行了归类整理而成: 概念类:讲解了一些概念性知识。...这样一来,当在外部获取这个属性时,获取的只是内部可变型的一个不可变版本,例如: 在公共API中: @interface EOCPerson : NSObject @property (nonatomic...因此,外部读取到的set都将是不可变的版本。 等一下,有个疑问: 在公共接口设置不可变set 和 将增删的代码放在公共接口中是否矛盾的? 答案:并不矛盾!...NSDictionary,和NSet时,我们又新创建了一个数组。

    91621

    Objective-C中的集合类

    下面详细的介绍Objective-C中的集合类以及每个集合类的用法,学过其他面向对象编程语言的小伙伴们看到OC的集合类会有种莫名的亲切感,理解起来问题不大,可以类比Java中的集合类去学习...在Objective-C中的集合类中主要包括不可变的数组--NSArray,  可变的数组--NSMutableArray,   不可变的字典--NSDictionary,    可变的字典--NSMutableDictionary...NSArray也是OC中的一个对象,使用NSArray也需要进行实例化,前面的博客在类的初始化中提到了便利初始化函数和便利构造器,在NSArray中也少不了这两样东西我们可以通过NSArray的便利初始化函数或者便利构造器进行...:NSMutableArray             NSArray的容量是固定的,而NSMutableArray的容量是可变的,我们可以在NSMutableArray实例化的时候先初始化一个容量,不过这个容量不是固定的...字典有可改变的和不和不可改变之分             1.不可变字典NSDictionary                 (1)字典的创建和获取字典的值 1 2 3 4 //不可变字典的初始化

    1.1K70

    面经之《招聘一个靠谱的iOS》import CYLBlockExecutor.himport CYLBlockExecutor.himport CYLNSObject+RunAtDeallo

    就是复制一个不可变 NSArray 的对象;2、使用了 atomic 属性会严重影响性能 ; 第1条的相关原因在下文中有论述《用@property声明的NSString(或NSArray,NSDictionary...【注:深浅拷贝的概念,在下文中有介绍,详见下文的:用@property声明的 NSString(或NSArray,NSDictionary)经常使用 copy 关键字,为什么?...在b非nil时,a和b指向同一个内存地址,在b变nil时,a变nil。此时向a发送消息不会崩溃:在Objective-C中向nil发送消息是安全的。...下面先看集合类immutable对象使用 copy 和 mutableCopy 的一个例子: NSArray *array = @[@[@"a", @"b"], @[@"c", @"d"]]; NSArray...2011年版本的Apple API 官方文档 - Associative References 一节中有一个MRC环境下的例子: // 在MRC下,使用runtime Associate方法关联的对象,

    1K100

    IOS开发系列—Objective-C之Foundation框架

    装箱和拆箱 8. 反射 9. 拷贝 10. 文件操作 11. 归档 Foundation概述 为什么前面说的内容中新建一个类的时候我们都是选择Cocoa Class呢?Cocoa是什么呢?...通常我们会将他们分为几类: 值对象 集合 操作系统服务:文件系统、URL、进程通讯 通知 归档和序列化 表达式和条件判断 Objective-C语言服务 UIKit主要用于界面构架,这里我们不妨也看一下它的类结构...中有两种方式的拷贝:copy和mutablecopy,这两中方式都将产生一个新的对象,只是后者产生的是一个可变对象。...补充-NSString的引用计数器 在好多语言中字符串都是一个特殊的对象,在ObjC中也不例外。...str1类似,虽然定义的是可变数组,但是它的本质还是字符串常量,事实上对于可变字符串只有为字符串常量时引用计数器才为-1,其他情况它的引用计数器跟一般对象完全一致; 后记:注意上面这段代码的运行结果是在

    77460

    词典对象 NSDictionary与NSMutableDictionary

    在Objective-C语言中,当然也有这方面的支持,词典对象就是做这个事情的,不过在同一个词典对象中可以保存多个不同类型的数据,不像Java与C只能保存声明的相同类型的数据,这一点还是可以解决不少问题的...采用(适配)快速枚举 如果一个类的实例提供了访问其它对象集合的方法,那么这个类就可以采用 NSFastEnumeration 协议....在 Foundation 框架中的集合类—NSArray, NSDictionary 以及 NSSet—就采用了这个协议,就像 NSEnumerator....很显然,在 NSArray 和 NSSet 中,枚举是针对它们的内容。对于其它的类,响应的文档应当明确哪个属性是用来迭代的。...快速枚举的使用 下面的例子向我们展示了如何 NSArray 和 NSDictionary 对象是如何使用快速枚举的.

    1.3K70

    Objective-C属性(property)的特性(attribute)

    用Objective-C做过开发的朋友都知道,类里面的属性(可以近似地理解为类的变量)是用@property关键字定义的,然后@property后面的括号,会写上若干「特性(attribute)」,后面跟数据类型...(Swift有类似的「Computed Properties/计算属性」) 所以,在没有Objective-C2.0的@property之前,我们几乎需要为所有的实例变量,手动写getter和setter...所有有mutable(可变)版本的属性类型,如NSString, NSArray, NSDictionary等等——他们都有可变的版本类型:NSMutableString, NSMutableArray...这些类型在属性赋值时,右边的值有可能是它们的可变版本。这样就会出现属性值被意外改变的可能。所以它们都应该用copy。...为了更好地和Swift混编(配合Swift的optional类型),在Xcode 6.3,Objective-C新增了一个语言特性,nullability。具体就是以上4个新特性。

    2K30

    OC学习13——Foundation框架中的集合

    OC集合类是一些非常有用的工具类,它可以用于存储多个数量不等的对象,并可以实现常用的数据结构(栈、队列等),此外,OC集合还可用于保存具有映射关系的关联数组。...NSArray代表有序可重复的集合;NSSet代表无序不可重复的集合;NSDictionary代表具有映射关系的集合。显然,这三类集合分别对应这Java中的List、Set和Map。   ...NSArray分别提供了类方法和实例方法来创建NSArray,两种创建方式基本类似,只是类方法以array开头,实例方法以init开头。...NSString的NSArray对象 19 NSArray* array1 = [NSArray arrayWithObjects: 20 @"Objective-C...NSSet表示元素个数和内容均不可变的集合,NSMutableSet则表示元素个数和内容可变的集合。

    2.1K80

    mach-o文件分析多余的类和方法

    x^2 + y^2 = r^2# mach-o文件分析多余的类和方法.md 背景 最近做包大小优化,在做项目代码优化时,其中有一个过程是分析Mach-O文件,看网上很多文章都说通过otool分析Mach-O...,获取objc_classrefs、objc_classlist等,然后找出无用类和无用方法。...于是笔者这两天就自己小马过河,实践了一下,做成了一个类似LinkMap分析的工具——OtoolAnalyse,分享一下具体的实现过程和原理。...方法类型 TEXT.objc_classname Objective-C 类名称 DATA.data 初始化过的可变数据 DATA.la_symbol_ptr lazy binding 的指针表,表中的指针一开始都指向...Objective-C 超类引用 实现 Mach-O文件获取:Xcode打包好的iPA,改后缀名为.zip,然后解压缩得到payload文件夹,其中有xxx.app,右键显示包内容,其中有xxx的exec

    3.7K11

    property属性相关小记

    如(NSInteger、CGFloat、int等) copy:建立一个索引计数为1的对象,然后释放旧对象,对实行了NSCopying协议的对象类型有效(NSString、NSDictionary、NSArray...何为堆和栈? Objective-C对象所占内存总是分配在“堆空间”,且堆内存由开发者释放,即release; 由编译器管理自动释放的,在方法中定义的变量通常在栈内。...因为他总是在超出他的作用域时被自动销毁了 在objective-c中只支持一个类型对象:block 堆区(heap):一般由程序员分配释放,若程序员不释放,则可能会引起内存泄漏。...注 堆和数据结构中的堆栈不一样,其类似于链表。 缺点: 栈对象严格的定义了生命周期也是其主要的缺点,栈对象的生命周期不适于Objective-C的引用计数内存管理方法。...声明NSString、NSArray、NSDictionary时,通常使用copy而不是strong属性?

    1.1K20

    30分钟摸透iOS中谓词NSPredicate的来龙去脉

    在iOS开发Cocoa框架中,有提供NSPredicate类,这个类通常也被成为谓词类,其主要的作用是在Cocoa中帮助查询和检索,但是需要注意,实质上谓词并不是提供查询和检索的支持,它是一种描述查询检索条件的方式...二、NSPredicate类的应用解析     NSPredicate提供创建谓词对象和解析谓词对象的方法,它也是Cocoa中有关谓词的类中的基类。...通过代码来创建谓词对象十分类似通过代码来创建Autolayout约束。通过前面我们的介绍,谓词实际是用表达式来验证对象,用代码来创建谓词实际就是用代码来创建表达式。...对象的验证前面有介绍,关于数据和集合的过滤函数,类别如下: @interface NSArray (NSPredicateSupport) //不可变数组使用过滤器后返回新数组...等通配符可以使用 MATCHES 正则匹配 ANY 对于数组集合类,验证其中任一元素 SOME 同ANY一致 ALL 对于数组集合类,验证其中所有元素 NONE 作用等同于NOT (ANY) IN 左侧在右侧集合中

    1.5K20

    iOS_Effective Objective-C 20 编写高质量iOS与OS X代码的52个有效方法

    三读Objective-C2.0 笔记~(作为一个OC开发者,必读之书) gitbook地址 一、熟悉Objective-C 1、了解Objective-C语言的起源 ​ Objective-C在C...Objective-C的重要工作都由“运行期组件”(runtime component)而非编译期来完成。OC面向对象特性所需的全部数据结构和函数都在运行期组件里。 ​...type) // 不管返回什么类型的对象,都是继承自同一个基类:UIButton // 意义:使用者无须关心属于哪个类,和其绘制等实现细节,只须知道如何创建,如何设置,如何使用就好 + (UIButton...要点: 若想令自定义的对象具有拷贝功能,则需实现NSCopying协议 若自定义对象分为可变版本与不可变版本,则应同事实现NSCopying与NSMutableCopying协议 复制对象时需决定采用浅拷贝还是深拷贝...但此时最好不要用属性,用一个方法就好。因为属性表达的意思是:类中有数据在支持着它。

    1.1K40

    iOS 进阶之深拷贝和浅拷贝

    前言 在开发的时候,使用copy的频率还是挺高的,我们只要copy定义的属性的设置方法并不保留新值,只是其拷贝一份值,为什么NSString、NSArray、NSDictionary属性的定义说那个copy...3. copy 和 mutablecopy copy:copy拷贝出来的对象类型总是不可变类型(例如, NSString, NSDictionary, NSArray等等) mutableCopy拷贝出来的对象类型总是可变类型...集合类对象的copy与mutableCopy 5.1 对不可变集合类: 不可变集合类对象是指NSArray、NSDictionary、NSSet ... 之类的对象。...下面先看集合类immutable对象使用copy和mutableCopy的一个例子: NSArray *array = @[@[@"a", @"b"], @[@"c", @"d"]; NSArray...在集合类对象中,对对象进行copy的对象就是不可变的,进行mutable就是可变的 6. copy 与 strong 对比 copy 此特质所表达的所属关系与 strong 类似。

    1.4K20

    oc深坑測试题及其答案

    B、Objective-C一个完整的类分为interface和implementation两块 C、Objective-C对象使用new分配内存,用delete释放 D、Objective-C协议分为非正式协议和正式协议...C、在Objective-C中通知对象运行某种操作,称为发送消息....www.lan D、ou3g 39、 在OC中扩展类的方法的形式不包含: 答案:(B) A、继承 B、多态 C、类目 D、延展 40、 关于KVC的描写叙述正确的是...B、一个对象在引用计数变为0时,会调用自己的dealloc方法 C、在dealloc方法里。...要调用扩展的方法,既能够用父类,也能够用子类 B、用类目能够扩展一个类,能够直接用该类或该类的实例对象,去调用该类目扩展的方法 C、延展就是类目 D、能够在一个类的外部,调用这个类延展的方法

    45030
    领券