文档章节

Obj-C的copy

Lambda8421
 Lambda8421
发布于 2015/01/30 09:49
字数 664
阅读 23
收藏 0

      iOS中如果想复制一个对象可以使用copy成员方法或者mutablecopy方法,这两个方法是NSObject类的成员方法。这两个方法在使用中是有所区别的。

      如果要复制一个NSArray对象,如果使用copy方法,则拷贝出一个NSArray对象,如果使用mutablecopy则复制出一 个NSMutableArray对象。copy总是拷贝出一个不可变的对象,而mutablecopy总是拷贝出可变的对象。

      如果是不可变对象调用copy方法,则拷贝出的对象也是不可变的,因此iOS规定:这种情况下的对象不进行复制,而是仅仅是多了一个指向这个对象的指针,对象的引用计数+1.这种情况叫做浅复制。

      其他的情况,例如可变复制为可变可变复制为不可变不可变复制为可变的情况都是将源对象复制一个副本,这个副本可变不可变由调用的方法决定。这种情况叫做深复制。

      所有的系统类对象都可以进行copy或者mutablecopy,而且不用去手动实现这两个方法。 但如果自定义类也要进行复制,这时候我们就要对自定义的对象进行copy或者mutablecopy操作,而这个时候我们就需要手动实现这两个方 法。

      让自定义类能够实现copy方法,需要让自定义的类实现<copying>协议,当然如果想使用mutablecopy方法则需要 实现<mutablecopying>协议。copying协议中只有一个函数,就是copyWithZone方法。需要在自己定义的类的实现文件中重写这个方法,自定义类为:Student,它含有一个name属性:

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

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

    stu . name = self . name ;

    return stu ;

}

allocWithZone:方法的调用者不是Student而是[self class]。

      如果写具体的类名,即Student,则此处就会开辟Student对象的内存,而如果还有别的类继承这个类,例如又进一步延伸出一个类叫做GoodStudent类继承Student类,那么在复制GoodStudent的时候首先调用父类的方法,则父类方法创建了一个 Student,这时候子类比父类多出来的一些属性就不能使用了,因为创建的是一个父类而不是子类,父类不能识别子类独有的属性。改为self class则当子类调用这个方法的时候,self是子类本身,这时候创建出的对象是子类对象,就可以识别子类的属性了。

© 著作权归作者所有

Lambda8421
粉丝 10
博文 121
码字总数 121640
作品 0
闸北
程序员
私信 提问
JavaScript学习 - Object.assign()

Object.assign() 方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。 一、语法 1. 参数 target 目标对象。sources 任意多个源对象。 2. 返回值 目标对象会被返回...

bobjoy
2016/12/27
17
0
Objective-C NSArray和NSMutableArray的详解 使用

原文地址:http://blog.csdn.net/totogo2010/article/details/7729377 Objective-C的数组比C++,Java的数组强大在于,NSArray保存的对象可以是不同的对象。但只能保存对象,int ,char,doubl...

孙启超
2013/12/19
1K
0
ios 深浅拷贝学习

ios 深浅拷贝学习 这里主要侧重于集合类的深浅拷贝,主要事因为工作的时候遇到这个问题。 有不足的地方欢迎指正,转载请注明。 首先我们需要有这样的一个前提: [array addObject:obj]; 这样...

晨曦之光
2012/05/28
566
0
实现一个栈

public interface MyStack<T> { /** * 判断栈是否为空 / boolean isEmpty(); /* * 清空栈 / void clear(); /* * 栈的长度 / int length(); /* * 数据入栈 / boolean push(T data); /* * 数据......

一贱书生
2016/11/17
1
0
IOS开发之深拷贝与浅拷贝(mutableCopy与Copy)详解

阅读本文之前首先了解copy与retain的区别,如果有不正确的地方望大家多多指教: copy与retain的区别: copy是创建一个新对象,retain是创建一个指针,引用对象计数加1。Copy属性表示两个对象内...

木木情深
2014/02/19
154
0

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
今天
4
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
6
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
8
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
6
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部