`
倾城一屁
  • 浏览: 75368 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

iOS/Objective-C开发 字典NSDictionary的深复制(使用category)

    博客分类:
  • iOS
阅读更多
目标:把NSDictionary对象转换成NSMutableDictionary对象,对象内容是字符串数组,需要实现完全复制(深复制)。
如果调用NSDictionary的mutableCopy方法,可以得到一个NSMutableDictionary对象,但这只是浅复制,如果我们修改NSDictionary中数组内的值(当然,数组必须是NSMutableArray),会发现,NSMutableDictionary对象内数组的值也跟着更改了。我们需要增加一个mutableDeepCopy方法来实现深复制,在该方法中,循环复制每一个元素。
要实现这一功能,有两种方法,一是继承,二是使用category。category与继承的区别在于,使用category并不是新建一个类,而是在原类的基础上增加一些方法(使用的时候还是用原类名),这样,我们就不需要修改已经在其他源文件中写好的类名,只需要导入h头文件,再把复制方法修改成我们新增的方法即可。
一、新建Objective-C category文件,我这Category填MutableDeepCopy,Category on填NSDictionary,所以生成的文件是NSDictionary+MutableDeepCopy.h和NSDictionary+MutableDeepCopy.m,生成的文件名很容易理解。
二、两文件源代码:

NSDictionary+MutableDeepCopy.h

#import <Foundation/Foundation.h>
 
@interface NSDictionary (MutableDeepCopy)
-(NSMutableDictionary *)mutableDeepCopy;
//增加mutableDeepCopy方法
@end


NSDictionary+MutableDeepCopy.m:

#import "NSDictionary+MutableDeepCopy.h"
 
@implementation NSDictionary (MutableDeepCopy)
-(NSMutableDictionary *)mutableDeepCopy
{
    NSMutableDictionary *dict=[[NSMutableDictionary alloc] initWithCapacity:[self count]];
    //新建一个NSMutableDictionary对象,大小为原NSDictionary对象的大小
    NSArray *keys=[self allKeys];
    for(id key in keys)
    {//循环读取复制每一个元素
        id value=[self objectForKey:key];
        id copyValue;
        if ([value respondsToSelector:@selector(mutableDeepCopy)]) {
            //如果key对应的元素可以响应mutableDeepCopy方法(还是NSDictionary),调用mutableDeepCopy方法复制
            copyValue=[value mutableDeepCopy];
        }else if([value respondsToSelector:@selector(mutableCopy)])
        {
            copyValue=[value mutableCopy];
        }
        if(copyValue==nil)
            copyValue=[value copy];
        [dict setObject:copyValue forKey:key];
 
    }
    return dict;
}
@end


测试:

#import <Foundation/Foundation.h>
#import "NSDictionary+MutableDeepCopy.h"
//导入头文件
int main (int argc, const char * argv[])
{
 
    @autoreleasepool {
        NSMutableArray *arr1=[[NSMutableArray alloc] initWithObjects:@"aa",@"bb",@"cc", nil];
        NSDictionary *dict1=[[NSDictionary alloc] initWithObjectsAndKeys:arr1,@"arr1", nil];
        NSLog(@"%@",dict1);
        NSMutableDictionary *dict2=[dict1 mutableCopy];
        //浅复制
        NSMutableDictionary *dict3=[dict1 mutableDeepCopy];
        //深复制
        [arr1 addObject:@"dd"];
        NSLog(@"%@",dict2);
        NSLog(@"%@",dict3);
 
    }
    return 0;
}
分享到:
评论

相关推荐

    objective-c

    Objective-C是一种面向对象的编程语言,它是C语言的超集,添加了Smalltalk风格的消息传递机制,主要用于开发苹果平台上的应用程序,包括iOS和macOS。Objective-C是在20世纪80年代由Stepanov和Moss在施乐帕洛阿尔托...

    objective-c_fundamentals

    Objective-C是苹果公司开发iOS和macOS应用的主要语言之一,尽管Swift语言逐渐成为主流,但Objective-C仍然在很多现有的项目中被广泛使用。 **特点:** - **兼容C语言**:Objective-C是C语言的一个超集,这意味着...

    objective-c教程

    Objective-C是一种广泛用于iOS应用...总而言之,Objective-C教程通过基础的语法介绍到高级的设计模式和框架使用,为初学者提供了一条清晰的学习路径,从零开始直至成为能够熟练使用Objective-C进行iOS开发的程序员。

    objective-C教程

    Objective-C是一种强大的面向对象编程语言,它是Apple的iOS和macOS操作系统的核心开发语言。本教程主要针对想要深入学习Objective-C的开发者,特别是那些对苹果平台应用程序开发感兴趣的人员。虽然教程为英文版,但...

    Objective-C 语言基础语法简介

    由于其强大的功能和灵活性,Objective-C 成为了开发 iOS 和 macOS 应用程序的主要语言之一。 #### 二、接口与实现 在 Objective-C 中,接口和实现是面向对象编程中的两个核心概念。 - **接口(Interface)**:定义...

    ios开发--字典转模型代码

    在iOS开发中,数据模型(Model)是用来存储和管理应用程序数据的重要组成部分。通常,我们会从服务器获取JSON或XML格式的数据,然后需要将其转化为 Objective-C 或 Swift 中的对象模型以便于操作和展示。本教程将...

    Objective-C 思维导图.pdf

    ### Objective-C 思维导图知识点详解 #### 1. 基础概念 - **1.1 简介** - **什么是 Objective-C**:Objective-C 是一种通用、...Objective-C 作为一种重要的编程语言,在 iOS 和 macOS 开发领域有着举足轻重的地位。

    Objective-C面试题.pdf

    - **异常**:Objective-C支持C语言风格的错误处理,但在iOS开发中较少使用。 #### 二、中级技术题 1. **Category与Extension**: - **Category**:为现有类添加新方法的一种方式,不改变原始类定义。 - **...

    Ojective-C 程序设计

    Foundation是Objective-C的基础框架,提供了诸如字符串(NSString)、数组(NSArray)、字典(NSDictionary)等基本数据类型,以及线程、文件系统、网络通信等系统服务。 六、UIKit框架 UIKit是iOS开发的核心框架,...

    Learn Objective‐C

    这使得Objective-C能够实现一些高级功能,如类别(Category)、协议(Protocol)和字典的键值编码(Key-Value Coding)。 5. **Foundation框架**:Objective-C的基础库是Foundation框架,它提供了各种基本数据类型...

    Object-C语言教程

    Object-C,全称Objective-C,是一种基于C语言的面向对象编程语言,主要用于Apple的iOS和macOS平台开发。它在C语言的基础上添加了Smalltalk风格的消息传递机制,使得对象间的交互更加灵活。本教程将深入探讨Object-C...

    iOS Category基类扩展源码

    iOS Category基类扩展是iOS开发中的一个重要概念,它允许开发者为已有的Objective-C类添加新的方法,而无需创建子类。Category在很多场景下都极其有用,比如为系统类添加便利方法、分类代码、实现单例模式等。下面将...

    iOS字典和模型之间互相转换

    在iOS中,字典通常是服务器返回的JSON数据结构,而模型则是我们自定义的Objective-C或Swift类,用于封装这些数据。手动进行这种转换不仅耗时,而且容易出错,因此,自动转换工具如MJExtension应运而生。 ...

    collection-后盾网.zip

    标题"collection-后盾网.zip"可能指的是一个包含Objective-C编程学习资源的压缩文件,可能涵盖了集合类(Collections)的使用,如数组(NSArray)、字典(NSDictionary)、集合(NSSet)等。在Objective-C中,这些...

    objecive-c函数

    Objective-C 是苹果公司为其操作系统 macOS 和 iOS 开发的一种面向对象的编程语言,它基于 C 语言并添加了 Smalltalk 风格的消息传递机制。在深入理解 Objective-C 函数之前,我们首先要明白对象和消息传递的基本...

    Object-C复习_object-c_复习_

    Objective-C(简称Obj-C)是一种基于C语言的、面向对象的编程语言,主要用于苹果的iOS和macOS操作系统开发。作为Apple的首选编程语言,理解并熟练掌握Objective-C对于iOS和macOS应用开发至关重要。本复习资料旨在...

    ios-类别.zip

    在iOS开发中,Category是Objective-C语言的一个强大特性,它允许我们扩展已有类的功能,而无需继承。HSKCategory项目(https://github.com/QiaokeZ/HSKCategory)是开发者QiaokeZ提供的一款开源库,专门针对iOS开发...

    Object-C 基础语法中文版

    Objective-C 支持私有属性和方法,可以通过使用分类(Category)或扩展(Extension)来隐藏内部实现细节。 **Class-level access** 在 Objective-C 中,类级别的方法使用 `+` 符号,而实例方法使用 `-` 符号。例如...

    object c语法总结

    - **Objective-C**:这是一种面向对象的编程语言,它是C语言的一种扩展,主要应用于Mac OS X和iOS操作系统上应用程序的开发。Objective-C引入了面向对象的概念,如类、对象、继承等,并与C语言兼容,使得开发者能够...

Global site tag (gtag.js) - Google Analytics