【Object-C】Copy

-copyWithZone:

Returns a new instance that’s a copy of the receiver. (required)

-mutableCopy

Returns the object returned by mutableCopyWithZone: where
the zone is nil.

Declaration:

- (id)copyWithZone:(NSZone *)zone

- (id)mutableCopy

简单的说,copy方法用于复制对象的副本,并返回对象的不可变副本(即使对象本身可变)。

mutablecopy方法则用于复制对象的可变副本,总是返回对象的可变副本(即使被复制对象的本身是不可变的)。

当程序对复制的原对象副本进行修改时,原对象不会受到影响。

//

//  main.m

//  NeuCopy

//

//  Created by mac on 14-12-1.

//  Copyright (c) 2014年
mac. All rights reserved.

//

#import
<Foundation/Foundation.h>

#import
"People.h"

#import
"Dog.h"

#import
"GoodPeople.h"

/*

copy
意义对于非可变对象来说,并不是产生新的对象,

而对于可变对象来说,是产生一个新的对象

multablecopy

对于非可变对象的话,也是产生一个可变对象,

对于可变对象来说,自然也是产生一个可变对象

*/

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

@autoreleasepool {

//用alloc方法新建一个p1对象

People * p1 = [[People
alloc]init];

p1.age
=
45;//设置age属性

//使用copy方法复制p2对象

People * p2 = [p1
copy];

p2.age
=
32;

//输出p1,p2及其属性

NSLog(@"实例对象p1:%@,p1的副p2:%@,
%i,%i",p1,p2,p1.age,p2.age);

//分别用alloc、copy、retain方法创建对象。

Dog * dog1 = [[Dog
alloc]initWithColor:4];

Dog * dog2 =  [dog1
copy];

Dog * dog3 = [dog1
retain];

//查看对象返回值

NSLog(@"%@ ,%@ , %@ ,%i, %i",dog1,dog2,dog3,dog1.color,dog2.color);

Dog * dog = [[Dog
alloc]init];

GoodPeople * gp = [[GoodPeople
alloc]init];

gp.dog
= dog;

GoodPeople * gp1 = [gp
copy];

NSLog(@"dog:%@, gp:%@, gp1:%@",dog,gp.dog,gp1.dog);

gp1.sex
=
0;

//释放内存

[dog
release];

[gp
release];

[gp1
release];

[p1
release];

[p2
release];

}

return
0;

}

#import
"People.h"

@implementation
People

-(id)copyWithZone:(NSZone
*)zone

{

//深拷贝,为copy副本申请新的内存空间

//    People *p = [[self class] allocWithZone:zone];

//

//    p.age = self.age;

//

//    return p;

//浅拷贝,将copy副本的self指针指向原对象的内存地址,原对象和副本地址将会是同一个

return  [self
retain];

}

@end

===>

2014-12-01 18:32:22.882 NeuCopy[3013:303]
实例对象p1:<People: 0x100102300>,p1的副p2:<People:
0x100102300>, 32,32

2014-12-01 18:32:22.884 NeuCopy[3013:303] <Dog: 0x1006013b0> ,<Dog: 0x100602290> , <Dog: 0x1006013b0> ,4, 4

2014-12-01 18:32:22.885 NeuCopy[3013:303] dog:<Dog: 0x10010a050>, gp:<Dog: 0x10010bac0>, gp1:<Dog: 0x10010bac0>

2014-12-01 18:32:22.886 NeuCopy[3013:303] dog is releaseing

2014-12-01 18:32:22.886 NeuCopy[3013:303] dog is releaseing

Program ended with exit code: 0

时间: 2024-10-13 16:24:50

【Object-C】Copy的相关文章

java.lang包【Object类】

基本描述: (1)Object类位于java.lang包中,java.lang包包含着Java最基础和核心的类,在编译时会自动导入: (2)Object类是所有Java类的祖先.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个类的方法.可以使用类型为Object的变量指向任意类型的对象 Object的主要方法介绍: package java.lang; public class Object { /* 一个本地方法,具体是用C(C++)在DLL中实现的,然后通过JNI调用.*

【Object C】 反射机制

Object-C 也提供了类似Java的反射机制.通过以下三种方式与运行环境交互: 1.直接通过Object-C源代码 2.通过NSObject中定义的方法: isKindOfClass isMemberOfClass responseToSelector:判断该实例是否调用指定方法 3.直接调用运行时函数进行动态编程 #import <Foundation/Foundation.h> #import "DCApple.h" int main(int argc, const

【Java基础】04_集合框架

一.java中集合了类的关系图[简化版] 注: 虚线矩形表示接口 实线矩形表示具体实现类 实线矩形加粗表示具体实现类使用频率高,作为重点掌握 集合是存储多个元素的容器,但是,由于数据结构不同,java就提供了多种集合类. 而这多种集合类有共性的功能,所以,通过不断的向上抽取,最终形成了集合体系结构. 二.集合与数组的异同(面试题) 1.相同点 他们都是容器,都可以储存数据. 2.区别 长度区别 数组固定:数组对象创建时,长度就固定 集合可变:集合可以随着存储元素个数的变化,长度发生变化 存储元素

【git常见问题】fatal: Not a valid object name: &#39;master&#39;.

创建本地分支:git branch dev 报错:fatal: Not a valid object name: 'master'. 原因: 问题描述-一个非法的master,原因:本地还没有创建master,你可以执行以下git branch,会发现没有看到本地分支列表 解决方案: 如果本地没有文件,添加一个文件 此时本地仓库主干master 创建成功,使用git branch 查看本地分支列表,会查看到如下图所示 可以创建本地分支: git branch dev 参考原文: http://s

【LeetCode】Copy List with Random Pointer

A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null. Return a deep copy of the list. 思路:第一遍正常复制链表,同时用哈希表保存链表中原始节点和新节点的对应关系,第二遍遍历链表的时候,再复制随机域. 这是一种典型的空间换时间的做法,n个节点,需要大小为O(n

【LeetCode】Copy List with Random Pointer 解题报告

A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null. Return a deep copy of the list. /** * Definition for singly-linked list with a random pointer. * class RandomListNode

【爬坑】Python 3.6 在 Socket 编程时出现类型错误 TypeError: a bytes-like object is required, not &#39;str&#39;

1. 问题描述 Python 3.6 在 Socket 编程时出现错误如下 Traceback (most recent call last): File "F:/share/IdeaProjects/test/mypython/test/test10_tcpclient.py", line 17, in <module> sock.send(str) TypeError: a bytes-like object is required, not 'str' Process

【报错】Validation failed for object=&#39;userLogin&#39;. Error count: 1

提交表单之后: Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Sat Dec 07 14:56:03 CST 2019 There was an unexpected error (type=Internal Server Error, status=500). Validation failed for object

Python之路【第二篇】:Python基础(一)

Python之路[第二篇]:Python基础(一) 入门知识拾遗 一.作用域 对于变量的作用域,执行声明并在内存中存在,该变量就可以在下面的代码中使用. 1 2 3 if 1==1:     name = 'wupeiqi' print  name 下面的结论对吗? 外层变量,可以被内层变量使用 内层变量,无法被外层变量使用 二.三元运算 1 result = 值1 if 条件 else 值2 如果条件为真:result = 值1如果条件为假:result = 值2 三.进制 二进制,01 八进

【深入浅出jQuery】源码浅析--整体架构(转)

最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐进增强)优雅的处理能力以及 Ajax 等方面周到而强大的定制功能无不令人惊叹. 另外,阅读源码让我接触到了大量底层的知识.对原生JS .框架设计.代码优化有了全新的认识,接下来将会写一系列关于 jQuery 解析的文章. 我在 github 上关于 jQuery 源码的全文注解,感兴趣的可以围观一下