iOS - 开发技巧内存管理iOS开发

iOS - copy与mutableCopy

2018-01-10  本文已影响76人  SkyMing一C
图片源于网络

浅拷贝与深拷贝

copy与mutableCopy

copy与mutableCopy的使用

//  Man.h
#import <Foundation/Foundation.h>

@interface Man : NSObject<NSCopying,NSMutableCopying>
@property (nonatomic,strong)NSString *name;
@property (nonatomic,assign)NSInteger year;
@end
//  Man.m
#import "Man.h"

@implementation Man
#pragma mark description方法内部不能打印self,不然会造成死循环
- (NSString *)description {
    return [NSString stringWithFormat:@"[name = %@,year = %ld]", _name,_year];
}
//自定义深拷贝,实现copyWithZone方法
-(id)copyWithZone:(NSZone *)zone{
    Man *newMan = [[[self class] allocWithZone:zone] init];
    newMan.name = self.name;
    newMan.year = self.year;
    return newMan;
}

-(id)mutableCopyWithZone:(NSZone *)zone{
    Man *newMan = [[[self class] allocWithZone:zone] init];
    newMan.name = self.name;
    newMan.year = self.year;
    return newMan;
}
@end
//调用
    Man *man = [[Man alloc]init];
    man.name = @"张三";
    man.year = 1;
    Man *newMan = [man copy];
    Man *newMutMan = [man mutableCopy];
    NSLog(@"man = %@,man地址 = %p,newMan = %@,newMan地址 = %p,newMutMan = %@, newMutMan地址 =  %p",man,man,newMan,newMan,newMutMan,newMutMan);
    /**
     man = [name = 张三,year = 1],
     man地址 = 0x604000036900,
     newMan = [name = 张三,year = 1],
     newMan地址 = 0x6040004207e0,
     newMutMan = [name = 张三,year = 1],
     newMutMan地址 =  0x60400003c2a0
     */
    newMan.name = @"李四";
    NSLog(@"man = %@,man地址 = %p,newMan = %@,newMan地址 = %p,newMutMan = %@, newMutMan地址 =  %p",man,man,newMan,newMan,newMutMan,newMutMan);
    /**
     man = [name = 张三,year = 1],
     man地址 = 0x604000036900,
     newMan = [name = 李四,year = 1],
     newMan地址 = 0x6040004207e0,
     newMutMan = [name = 张三,year = 1],
     newMutMan地址 =  0x60400003c2a0
     */
    newMutMan.name = @"王五";
    NSLog(@"man = %@,man地址 = %p,newMan = %@,newMan地址 = %p,newMutMan = %@, newMutMan地址 =  %p",man,man,newMan,newMan,newMutMan,newMutMan);
    /**
     man = [name = 张三,year = 1],
     man地址 = 0x604000036900,
     newMan = [name = 李四,year = 1],
     newMan地址 = 0x6040004207e0,
     newMutMan = [name = 王五,year = 1],
     newMutMan地址 =  0x60400003c2a0
     */

block为什么要使用copy

参考

iOS 浅拷贝和深拷贝的区别? copy和mutableCopy的区别?

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

ios深拷贝,浅拷贝,拷贝自定义对象的简单介绍

上一篇 下一篇

猜你喜欢

热点阅读