资讯专栏INFORMATION COLUMN

iOS开发系列--基于MJExtension的Runtime简单使用

reclay / 1799人阅读

摘要:简单来说,深拷贝就是内容拷贝,浅拷贝就是指针拷贝。更具体的用法,就不作过多解释,自行百度吧。由于数据的复杂性或者没有实现协议,简单的使用来拷贝可能无法达到预期效果,由此就有了的衍生使用。

首先了解两个概念:深拷贝和浅拷贝
简单来说,深拷贝就是内容拷贝,浅拷贝就是指针拷贝。更具体的用法,就不作过多解释,自行百度吧。

// 字符串是直接赋值的,右侧如果是copy,那么就是浅拷贝;右侧如果是mutableCopy,那么就是深拷贝。  
   NSString *string1 = @"helloworld";  
   NSString *string2 = [string1 copy]; // 浅拷贝  
   NSString *string3 = [string1 mutableCopy]; // 深拷贝  
   NSMutableString *string4 = [string1 copy]; // 浅拷贝  
   NSMutableString *string5 = [string1 mutableCopy]; // 深拷贝  
  
   NSLog(@"string1 = %d;string2 = %d",string1,string2);  
   NSLog(@"string1 = %d;string3 = %d",string1,string3);  
   NSLog(@"string1 = %d;string4 = %d",string1,string4);  
   NSLog(@"string1 = %d;string5 = %d",string1,string5);  

打印结果:

使用场景:

在某些时候,需要复制一份相同的Model数据,但是又不影响原Model,类似上述的深拷贝,又或者在大量相同字段中需要改变其中一个字段的值。由于Model数据的复杂性或者没有实现NSCopy协议,简单的使用Copy来拷贝可能无法达到预期效果,由此就有了MJExtension的衍生使用。

核心代码:
//
//  NSObject+TMCopy.h
//  LJDY
//
//  Created by TIM on 16/8/23.
//  Copyright © 2016年 mimi. All rights reserved.
//

#import 

@interface NSObject (TMCopy)

/**
 实现类的copy
 */
- (id)tm_copy;

@end
//
//  NSObject+TMCopy.m
//  LJDY
//
//  Created by TIM on 16/8/23.
//  Copyright © 2016年 mimi. All rights reserved.
//

#import "NSObject+TMCopy.h"

@implementation NSObject (TMCopy)

- (id)tm_copy
{
    Class clazz = [self class];;
    __strong Class newClass = [[clazz alloc] init];
    Class superClass = self.superclass;
    while (superClass && ![NSStringFromClass(superClass) isEqualToString:@"NSObject"]) {
        [self setupValueWithNewClass:newClass Class:superClass];
        superClass = superClass.superclass;
    }
    [self setupValueWithNewClass:newClass Class:clazz];
    return newClass;
}

- (void)setupValueWithNewClass:(Class)newClass
                         Class:(Class)clazz
{
    int i;
    unsigned int propertyCount = 0;
    //runtime 获取类的所有属性
    objc_property_t *propertyList = class_copyPropertyList(clazz, &propertyCount);
    NSDictionary *dic;
    //获取数组中需要转换的模型类
    if ([clazz respondsToSelector:@selector(mj_objectClassInArray)]) {
        dic = [clazz mj_objectClassInArray];
    }
    for (i = 0; i < propertyCount; i++) {
        objc_property_t *thisProperty = propertyList + i;
        const char *propertyName = property_getName(*thisProperty);
        //属性名
        NSString *property = [NSString stringWithCString:propertyName encoding:NSUTF8StringEncoding];
        id value = [self valueForKey:property];
        //如果对象是模型类,则再次遍历模型类中的属性
        if (dic && [[dic allKeys] containsObject:property]) {
            //特殊处理模型中包含模型数组
            if ([value isKindOfClass:[NSArray class]]) {
                NSMutableArray *modelArray = [NSMutableArray array];
                for (Class _arrayClass in value) {
                    [modelArray addObject:[_arrayClass tm_copy]];
                }
                [newClass setValue:modelArray forKey:property];
            }
            else {
                id _class = [value tm_copy];
                [newClass setValue:_class forKey:property];
            }
        }
        else {
            [newClass setValue:value forKey:property];
        }
    }
    free(propertyList);
}

@end
使用方法:
FriendItem *_item = [item tm_copy];
结果:

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/17088.html

相关文章

  • iOS开发学习路线

    摘要:开发学习路线前言这里筑梦师是一名正在努力学习的开发工程师目前致力于全栈方向的学习希望可以和大家一起交流技术共同进步用简书记录下自己的学习历程个人学习方法分享本文阅读建议一定要辩证的看待本文本文主要是本人对开发经验中总结的知识点本文所有观点仅 iOS开发学习路线 前言 这里筑梦师,是一名正在努力学习的iOS开发工程师,目前致力于全栈方向的学习,希望可以和大家一起交流技术,共同进步,用简书...

    ctriptech 评论0 收藏0
  • MJExtension源码学习(一)

    摘要:继续进行优秀开源框架的源码学习,这次打算学习一些常用的解析的框架,比如,,等。这句代码也就是递归思想的提现,如果这个成员变量是一个自定义类的,那么该成员变量对应的值应该也是一个,所以用这个二级的类继续调用方法,继续解析下去。 继续进行优秀开源框架的源码学习,这次打算学习一些常用的model解析的框架,比如YYModel,MJExtension,Mantle等。我自己用过YYModel和...

    Crazy_Coder 评论0 收藏0
  • MJExtension源码学习(二)

    摘要:接上篇源码学习一总览这一次我们来看最新版本的代码,当前最新为在看源码之前,注意这个类。因为它重写了方法,然后把使用的的一些配置,统一写到了这个文件中。项目中还有很多其他的细节就不单说了。 接上篇MJExtension源码学习(一) 总览 这一次我们来看MJExtension最新版本的代码,当前最新为3.0.15 在看源码之前,注意MJExtensionConfig这个类。因为它重写了+...

    pekonchan 评论0 收藏0
  • iOS进阶

    摘要:然而,副作用对于系统的可测试性来说就是一剂毒药,并且可能会因应用程序和请求的不同而出现差异性。这些事件并不具备特定时序性,甚至它们可能同时发生。粘性动画中,粘性小球会根据移动距离的大小拥有不同的弹性程度。 PPAsyncDrawingKit - 实现了一系列基础 UI 控件的轻量级 ASDK 一款轻量级的 ASDK,实现了一系列基础 UI 控件。 iOS 开发之 Runtime 常用示...

    Cheng_Gang 评论0 收藏0
  • iOS文章

    摘要:在单核时代,使用多线程技术更多时候是为了避免耗时操作堵塞了主线程。而在多核时代,多线程技术才真正完成了提升执行效率的工作。 iOS 监控 - DNS 劫持 DNS 劫持指在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范围以外的请求放行,否则返回假的 IP 地址或者什么都不做使请求失去响应。 JavaScript深入系列15篇正式完结! 写在前面 JavaScript 深入...

    dreamans 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<