OC中copy的使用

copy的使用

copy概念

通过copy方法产生副本的过程

copy规律

可变/不可变对象 –> copy–> 不可变对象

可变/不可变对象 –> mutablecopy–>可变对象

copy与mutablecopy

copy(浅复制),只是拷贝指针

mutablecopy(深复制),拷贝内容,分配新的内存空间

copy与内存管理

  • 不可变对象 copy(浅拷贝)
  • 只是拷贝地址 没真正分配新的内存空间
  • 源对象,引用计数+1
  • 副本对象,引用计数也是和源对象一样,因为指向同一对象内存空间
  • 源对象和副本对象是同一个对象

  • 不可变对象 mutablecopy(深拷贝 ) 分配新的内存空间

  • 分配新的内存空间 存储了新的副本 引用计数为1
  • 源对象,引用计数还是为1
  • 副本对象,引用计数也是1,`因为是新的内存空间,只有副本对象指向该空间“
  • 源对象和副本对象是两个不同对象,只是它们的内容相同

@property中的copy关键字

MRC
  • copy 只用与NSString\block
  • retain 除了NSString\block以外的OC对象
  • assign 基本数据类型 枚举 结构体(非OC对象)
  • 当两个对象互相引用 一个用retain 另一个用assign

MRC中,retain引用计数+1,相当于浅拷贝,若重新赋值就会修改到原来的值

如果使用retain的话,代码如下


  NSMutableString *str = [NSMutableString string];
  [str appendString:@"小明"];
  //设置姓名
  p.name = str;
  NSLog(@"p.name = %@",p.name);   //小明

  [str appendString:@"&小红"];
  NSLog(@"p.name = %@",p.name);   //小明&小红

如果使用copy的话,代码如下

  NSMutableString *str = [NSMutableString string];
  [str appendString:@"小明"];
  //设置姓名
  p.name = str;
  NSLog(@"p.name = %@",p.name);   //小明

  [str appendString:@"&小红"];
  NSLog(@"p.name = %@",p.name);   //小红
ARC
  • copy 只用与NSString\block
  • strong 除了NSString\block以外的OC对象
  • weak 当两个对象互相引用 一个用retain 另一个用weak
  • assgin 基本数据类型 枚举 结构体(非OC对象)

为自定义的类实现copy操作

1)创建一个自定义的类

2)遵守NSCopying协议

3)实现协议中声明的方法

  • 实现copyWithZone方法,在该方法中返回一个对象的副本
  • 在copyWithZone方法中,创建一个新的对象,并设置该对象的数据与现有对象一致,并返回该对象

4)【对象 copy】

目的:产生一个副本对象
自定义对象的拷贝都是深拷贝

Student.h文件

#import <Foundation/Foundation.h>
@interface Student : NSObject<NSCopying>

@property (nonatomic,strong) NSString *name;
@property (nonatomic,assign) NSInteger age;

@end

Student.m文件

“`

import “Student.h”

@implementation Student

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

    Student *st0 = [Student new];

    st0.name = self.name;
    st0.age = self.age;

    return st0;

}
@end

“`

main.m文件

“`
Student *st = [Student new];
NSLog(@”st = %p”,st); //st = 0x100206a50

Student *st1 = [st copy];
NSLog(@”st1 = %p”,st1); //st1 = 0x100206e80

“`

通过打印地址可以看到,这是两个不同空间的对象,只是它们的内容是相同的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值