OC之【深拷贝(mutableCopy)和浅拷贝(copy)】

原创 2013年12月01日 20:58:06

main.m文件


#import <Foundation/Foundation.h>

#import "Student.h"

#import "GoodStudent.h"


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


#pragma mark 字符串的拷贝(深拷贝)

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

void stringMutableCopy() {

    // string:1

    NSString *string = [[NSString alloc] initWithFormat:@"age is %i", 10];

    

    // 产生了一个新的对象,计数器为1。源对象的计数器不变。

    // str:1

    // string:1

    NSMutableString *str = [string mutableCopy];

    //NSLog(@"str:%zi", [str retainCount]);

    //NSLog(@"string:%zi", [string retainCount]);

    

    // strstring不是相同对象

    // NSLog(@"%i", str == string);

    

    [str appendString:@" abcd"];

    

    NSLog(@"string:%@", string);

    NSLog(@"str:%@", str);

    

    // str:0

    [str release];

    // string:0

    [string release];

}


#pragma mark 演示字符串的拷贝(浅拷贝)

// 只有一种情况是浅拷贝:不可变对象调用copy方法时


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

void stringCopy() {

    NSString *string = [[NSString alloc] initWithFormat:@"age is %i", 10];

    NSLog(@"%zi", [string retainCount]);

    

    // copy产生的是不可变副本,由于源对象本身就不可变,所以为了性能着想,copy会直接返回源对象本身

    // 源对象计数器会+1

    // 在浅拷贝情况下,copy其实就相当于retain

    NSString *str = [string copy];

    NSLog(@"%zi", [string retainCount]);

    

    // NSLog(@"%i", str == string);

    

    [str release];

    [string release];

}


#pragma mark 可变字符串的copy(深拷贝)

void mutableStringCopy() {

    NSMutableString *string = [NSMutableString stringWithFormat:@"age is %i", 10];

    

    // 会产生一个新对象,str计数器为1

    NSString *str = [string copy];

    

    [str release];

}


#pragma mark 可变字符串的MutableCopy(深拷贝)

void mutableStringMutableCopy() {

    NSMutableString *string = [NSMutableString stringWithFormat:@"age is %i", 10];

    

    // 会产生一个新对象,str计数器为1

    NSMutableString *str = [string mutableCopy];

    

    [str appendString:@"1234"];

    

    NSLog(@"str:%@", str);

    NSLog(@"string:%@", string);

    

    [str release];

}


#pragma mark Studentnamecopy

void studentNameCopy() {

    Student *stu = [[[Student alloc] init] autorelease];

    

    NSMutableString *string = [NSMutableString stringWithFormat:@"age is %i", 10];

    

    stu.name = string;

    

    [string appendString:@"abcd"];

    

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

    NSLog(@"string=%@", string);

}


#pragma mark Studentcopy

void studentCopy() {

    Student *stu1 = [Student studentWithName:@"stu1"];

    

    Student *stu2 = [stu1 copy];

    stu2.name = @"stu2";

    

    NSLog(@"stu1:%@", stu1);

    NSLog(@"stu2:%@", stu2);

    

    [stu2 release];

}


void goodStudentCopy() {

    GoodStudent *stu1 = [GoodStudent goodStudentWithAge:10 name:@"good1"];

    

    GoodStudent *stu2 = [stu1 copy];

    stu2.name = @"good2";

    stu2.age = 11;

    

    NSLog(@"stu1:%@", stu1);

    NSLog(@"stu2:%@", stu2);

}


int main(int argc, const char * argv[])

{

    @autoreleasepool {

        goodStudentCopy();

    }

    return 0;

}


Student.h文件

#import <Foundation/Foundation.h>


@interface Student : NSObject <NSCopying>


// copy代表set方法会release旧对象、copy新对象

// 修改外面的变量,并不会影响到内部的成员变量

// 建议:NSString一般用copy策略,其他对象一般用retain

@property (nonatomic, copy) NSString *name;


+ (id)studentWithName:(NSString *)name;


@end



Student.m文件

#import "Student.h"


@implementation Student


+ (id)studentWithName:(NSString *)name {

    // 这里最好写[self class]

    Student *stu = [[[[self class] alloc] init] autorelease];

    stu.name = name;

    

    return stu;

}


- (void)dealloc {

    [_name release];

    

    [super dealloc];

}


#pragma mark description方法内部不能打印self,不然会造成死循环

- (NSString *)description {

    return [NSString stringWithFormat:@"[name=%@]", _name];

}


#pragma mark copying协议的方法

// 这里创建的副本对象不要求释放

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

    Student *copy = [[[self class] allocWithZone:zone] init];

    

    // 拷贝名字给副本对象

    copy.name = self.name;

    

    return copy;

}


@end


GoodStudent.h

#import "Student.h"


@interface GoodStudent : Student


@property (nonatomic, assign) int age;


+ (id)goodStudentWithAge:(int)age name:(NSString *)name;

@end


GoodStudent.m

#import "GoodStudent.h"


@implementation GoodStudent


+ (id)goodStudentWithAge:(int)age name:(NSString *)name {

    GoodStudent *good = [GoodStudent studentWithName:name];

    

    good.age = age;

    

    return good;

}


- (NSString *)description {

    return [NSString stringWithFormat:@"[name=%@, age=%i]", self.name, _age];

}


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

    // 一定要调用父类的方法

    GoodStudent *copy = [super copyWithZone:zone];

    

    copy.age = self.age;

    

    return copy;

}


@end


版权声明:本文为博主原创文章,未经博主允许不得转载。

Swift 值类型,引用类型,深拷贝,浅拷贝,Copy,MutableCopy

原创Blog,转载请注明出处 http://blog.csdn.net/hello_hwc?viewmode=list 我的stackoverflow前言:Swift相对应Objective ...
  • Hello_Hwc
  • Hello_Hwc
  • 2015年12月01日 13:24
  • 5701

iOS Copy 和 MutableCopy的区别 深浅拷贝的区别

原创的链接在这里: 原创的地址请点击这里哦 概述 对于系统的非容器类对象,对一不可变对象复制,copy是指针复制(浅拷贝)和mutableCopy就是对象复制(深拷贝)。如果是对可变对象复...
  • fanjunxi1990
  • fanjunxi1990
  • 2013年11月20日 17:27
  • 5340

copy和mutableCopy到底是浅拷贝还是深拷贝?

请尊重原作者的辛苦劳动,转载请注明出处。 实践是检验真理的唯一标准。下面就让我们在实践中认识copy和mutableCopy的共同点和区别。 1.copy和mutableCopy的实现过程。 想要一个...
  • joe1209
  • joe1209
  • 2014年08月14日 19:57
  • 1536

OC中关于copy和mutableCopy的使用 及深拷贝、浅拷贝的概念

一、OC中copy的作用:利用一个源对象产生一个副本对象。 二、如何使用copy功能 一个对象可以通过调用copy或mutableCopy的方法来创建一个副本对象。 1、copy:不管是可变对象还是...
  • sharmir
  • sharmir
  • 2016年06月12日 15:44
  • 468

IOS开发之深拷贝与浅拷贝(mutableCopy与Copy)详解

IOS开发之深拷贝与浅拷贝(mutableCopy与Copy)详解 阅读本文之前首先了解copy与retain的区别,如果有不正确的地方望大家多多指教: copy与retain的区别: ...
  • lgx_admin
  • lgx_admin
  • 2016年04月15日 15:10
  • 219

IOS 之copy(浅拷贝)和mutableCopy(深拷贝) 以及strong 和weak理解

内存管理几个重要的概念抽象,比较难以理解,找了一份资料,这些一般项目中少用到,但理解也很有必要 致谢原作者 原文地址:http://blog.csdn.net/xdrt81y/article/deta...
  • u014544346
  • u014544346
  • 2016年03月05日 17:27
  • 231

IOS开发之深拷贝与浅拷贝(mutableCopy与Copy)详解

阅读本文之前首先了解copy与retain的区别,如果有不正确的地方望大家多多指教: copy与retain的区别: copy是创建一个新对象,retain是创建一个指针,引用对象计数...
  • xdrt81y
  • xdrt81y
  • 2014年04月22日 22:56
  • 22509

深拷贝(mutablecopy)与浅拷贝(Copy)详解

ios中并不是所有的对象都支持copy,mutableCopy,遵守NSCopying 协议的类可以发送copy消息,遵守NSMutableCopying 协议的类才可以发送mutableCopy消息...
  • oldcatwarrior
  • oldcatwarrior
  • 2016年03月08日 18:58
  • 156

IOS开发之深拷贝与浅拷贝(mutableCopy与Copy)详解

浅拷贝 浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间。如: char* str = (char*)malloc(100); char* str2 = str; 浅...
  • CXLiao
  • CXLiao
  • 2016年04月06日 09:10
  • 282

IOS开发之深拷贝与浅拷贝(mutableCopy与Copy)详解

阅读本文之前首先了解copy与retain的区别,如果有不正确的地方望大家多多指教: copy与retain的区别: copy是创建一个新对象,retain是创建一个指针,引用对象计数加1。C...
  • u013375242
  • u013375242
  • 2014年01月10日 17:48
  • 857
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OC之【深拷贝(mutableCopy)和浅拷贝(copy)】
举报原因:
原因补充:

(最多只允许输入30个字)