iOS对象的拷贝

作者: Cheriez | 来源:发表于2017-02-15 16:07 被阅读16次

一 :拷贝的相关概念

copy语法的目的:改变副本的时候,不会影响到源对象;

深拷贝:内容拷贝,会产生新的对象。新对象计数器置为1,源对象计数器不变。

浅拷贝:指针拷贝,不会产生新的对象。源对象计数器+1。

二:拷贝的实现

实现copy,必须实现<NSCopying>协议 ,即 copyWithZone方法,返回一个不可变对象。

实现mutableCopy,必须实现<NSMutableCoping>协议,即 mutableCopyWithZone方法 ,返回一个可变对象。

对于数组,字典,字符串 等都已经实现了<NSCopying>的协议。

三:数组、字典、字符串等拷贝原则

1.对于系统的非容器类的拷贝

对于不可变对象 ,copy实际是浅拷贝,mutableCopy是深拷贝。

对于可变对象 ,copy、mutableCopy都是深拷贝

2.对于系统的容器类的拷贝

以上原则同样是适用的,但是容器类的对象都是指针拷贝。

如果想要元素对象也是对象复制,就需要实现深拷贝。

参考苹果官方文档

四:自定义对象的拷贝

Person.h

#import@interface Person : NSObject

@property (nonatomic,retain) NSMutableArray *apples;

@property (nonatomic,assign) int                         age;

@end

Person.m

#import "Person.h"

@implementation Person

- (id)copyWithZone:(NSZone *)zone{

        Person *p = [[self class] allocWithZone:zone];

        p.apples = [_apples mutableCopy];

        p.age = _age;

        return p;

}

@end

测试

Person *p = [[Person alloc] init];

p.apples = [NSMutableArray arrayWithObjects:@"iphone",@"ipad", nil nil];

p.age = 20;

Person *p1 = [p copy];

if(p != p1){

        NSLog(@"p1.age=%d",p1.age);

        NSLog(@"p1.apples=%@",p1.apples);

}

五:理解下property里的copy、strong区别

copy

#import@interface Person : NSObject

@property (nonatomic,copy  ) NSString      *name;

@end

NSMutableString *string = [[NSMutableString alloc] initWithString:@"1111"];

Person *person =[[Person alloc] init];

person.name = string;

[string appendString:@"1233"];

property copy 实际上就对name干了这个:

- (void)setName:(NSString *)name

{

        _name = [name copy];

}

假设name为NSMutableString,会发生什么事?

@property (nonatomic, copy) NSMutableString *name;

实际上内部还是:

- (void)setName:(NSMutableString *)name

{

        _name = [name copy];

}

copy出来的仍然是不可变字符!如果有人用NSMutableString的方法,就会崩溃:

[person.name appendString:@"1233"];

strong

@property (nonatomic, strong) NSString *name;

NSMutableString *string = [NSMutableString stringWithFormat:@"汉斯哈哈哈"];

HSPerson *person = [[HSPerson alloc] init];

person.name = string;

// 可以改变person.name的值,因为其内部没有生成新的对象

[string appendString:@" hans"];

NSLog(@"name = %@", person.name);

相关文章

  • 如何实现数组的深拷贝

    概念 iOS中有深拷贝和浅拷贝的概念,其中,浅拷贝并不拷贝对象本身,只是把指向对象的指针进行拷贝,该对象的引用系数...

  • 浅拷贝与深拷贝

    写在前面 浅拷贝:指向对象所在内存指针的拷贝,对象所在内存不变 深拷贝:对象所在内存重新拷贝一份 在 iOS 中,...

  • 拷贝----浅拷贝,深拷贝(copy),引用计数拷贝及区别

    在iOS中,我们有时要用到copy的方法。对对象进行拷贝。总结了一下拷贝。 1)iOS拷贝都有哪些? 拷贝有三种:...

  • IOS

    一、IOS基础 1、浅拷贝与深拷贝浅拷贝:拷贝对象的指针成员变量和原对象的指针成员变量指向同一块内存空间。深拷贝:...

  • 深拷贝浅拷贝

    参考链接: ios深拷贝,浅拷贝,拷贝自定义对象的简单介绍 - daiyelang的专栏 - 博客频...

  • iOS中的深拷贝和浅拷贝

    深拷贝就是生成一个新的对象,内容和原对象完全相同。浅拷贝即是指针的拷贝,生成一个新的指针指向原对象 iOS中的拷贝...

  • iOS深拷贝(MutableCopy)与浅拷贝(Copy)的区别

    深拷贝和浅拷贝的概念 iOS中有深拷贝和浅拷贝的概念,那么何为深拷贝何为浅拷贝呢?浅拷贝:浅拷贝并不拷贝对象本身,...

  • oc 浅拷贝与深拷贝

    1. 先说结论: 分可变对象、不可变对象、自定义对象、容器对象几种: 例子参考: iOS开发——深拷贝与浅拷贝详...

  • ios_最新面试题

    1.ios 深拷贝和浅拷贝的区别 可以简单整理为:不可变对象的copy,都是浅拷贝,地址相同, 可变对象的copy...

  • ios 了解深拷贝和浅拷贝

    iOS 了解深拷贝和浅拷贝 一、概念与总结 1、浅拷贝 浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一...

网友评论

    本文标题:iOS对象的拷贝

    本文链接:https://www.haomeiwen.com/subject/pwxqwttx.html