objective-c copy mutableCopy 拷贝对象

原来不是所有的对象都支持 copy

只有遵守NSCopying 协议的类才可以发送copy消息

只有遵守NSMutableCopying 协议的类才可以发送mutableCopy消息

假如发送了一个没有遵守上诉两协议而发送 copy或者 mutableCopy,那么就会发生异常

默认 nsobject没有遵守这两个协议

但是 copy和mutableCopy这两个方法是nsobject定义的

如果想自定义一下copy 那么就必须遵守NSCopying,并且实现 copyWithZone: 方法

如果想自定义一下mutableCopy 那么就必须遵守NSMutableCopying,并且实现 mutableCopyWithZone: 方法

看了一下几个遵守 NSCopying协议的基本上是一些基础核心类

比如 NSString NSNumber

copy以后,就是返回一个新的类,你要负责释放掉,原先被拷贝的retaincount没有+1 所以,不需要负责释放

copy和mutableCopy 就是copy返回后的是不能修改的对象, mutableCopy返回后是可以修改的对象

下面是实现一个copyWithZone的例子

@interface BankAccount: NSObject <NSCopying>

{

double accountBalance;

long accountNumber;

}

-(void) setAccount: (long) y andBalance: (double) x;

-(double) getAccountBalance;

-(long) getAccountNumber;

-(void) setAccountBalance: (double) x;

-(void) setAccountNumber: (long) y;

-(void) displayAccountInfo;

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

@end

-(id) copyWithZone: (NSZone *) zone

{

BankAccount *accountCopy = [[BankAccount allocWithZone: zone] init];

[accountCopy setAccount: accountNumber andBalance: accountBalance];

return accountCopy;

}

深度拷贝和浅拷贝

上面的方法是浅拷贝,意思就是,只是重新分配了BankAccount类的内存,并没有对BankAccount的属性重新分配内存

两个BankAccount的属性都是指向同一个地方的. 修改了其中一个BankAccount属性,那么另外一个BankAccount属性

也会一起发生变化

深度拷贝

深度拷贝这里用到一个存档功能,先把原先的存档(其实就是序列化对象,然后存到一个文件,等下可以反序列化出来赋值给另外一个对象),然后存到另外的而一个对象中

NSKeyedArchiver 序列化类

NSKeyedUnarchiver 反序列化类

NSArray *myArray1;

NSArray *myArray2;

NSMutableString *tmpStr;

NSMutableString *string1;

NSMutableString *string2;

NSMutableString *string3;

NSData *buffer;

string1 = [NSMutableString stringWithString: @"Red"];

string2 = [NSMutableString stringWithString: @"Green"];

string3 = [NSMutableString stringWithString: @"Blue"];

myArray1 = [NSMutableArray arrayWithObjects: string1, string2, string3, nil];

buffer = [NSKeyedArchiver archivedDataWithRootObject: myArray1];

myArray2 = [NSKeyedUnarchiver unarchiveObjectWithData: buffer];

tmpStr = [myArray1 objectAtIndex: 0];

[tmpStr setString: @"Yellow"];

NSLog (@"First element of myArray1 = %@", [myArray1 objectAtIndex: 0]);

NSLog (@"First element of myArray2 = %@", [myArray2 objectAtIndex: 0]);

cocoa的属性也有3种

protected - Access is allowed only
by methods of the class and any subclasses. 默认是这个

private - Access is restricted to methods of the class. Access is not available to subclasses.

public - Direct access available to methods of the class, subclasses and code
in other module files and classes.

public的变量可以用 -> 操作符访问

参考地址:http://www.techotopia.com/index.php/Copying_Objects_in_Objective-C

http://wenku.baidu.com/view/12d6592fb4daa58da0114af0.html

http://www.techotopia.com/index.php/Objective-C_-_Data_Encapsulation,_Synthesized_Accessors_and_Dot_Notation

关于访问器的详细文档

http://cocoacast.com/?q=node/103

objective-c copy mutableCopy 拷贝对象

时间: 2024-08-09 06:33:47

objective-c copy mutableCopy 拷贝对象的相关文章

使用copy来拷贝对象

拷贝对象 您通过将 copy 消息发送给对象,以制作对象的副本. NSArray *myArray = [yourArray copy]; 要拷贝,接收对象的类必须遵守 NSCopying 协议.如果想要对象可供拷贝,必须采用并实施此协议的 copy 方法. 有时,当您想要确保对象的状态在使用时不会更改,会拷贝从程序的其他地方获取的对象. 拷贝行为是特定于某一个类的,具体取决于实例的特定性质.大多数类实现深拷贝,即复制所有实例变量和属性:部分类(如集类)实现浅拷贝,即仅复制对这些实例变量和属性的

Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)

http://www.jb51.net/article/15714.htm 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象.2. copy.deepcopy 深拷贝 拷贝对象及其子对象 一个很好的例子: 1 import copy 2 a = [1, 2, 3, 4, ['a', 'b']] #原始对象 3 4 b = a #赋值,传对象的引用 5 c = copy.copy(a) #对象拷贝,浅拷贝 6 d = copy.deepcopy(a) #对象拷贝,深拷贝

夺命雷公狗—angularjs—23—copy拷贝对象

copy这在angularjs中是一个拷贝对象的方法: <!DOCTYPE html> <html lang="en" ng-app="myapp"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js/angular.min.js"></script>

copy&amp;mutableCopy 浅拷贝(shallow copy)深拷贝 (deep copy)

本文来自 这里,原文作者微博MicroCai 概念 对象拷贝有两种方式:浅复制和深复制.顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针:深复制是直接拷贝整个对象内存到另一块内存中. 一图以蔽之 再简单些说:浅复制就是指针拷贝:深复制就是内容拷贝. 集合的浅复制 (shallow copy) 集合的浅复制有非常多种方法.当你进行浅复制时,会向原始的集合发送retain消息,引用计数加1,同时指针被拷贝到新的集合. 现在让我们看一些浅复制的例子: NSArray *shallowCop

NSString NSMutableString copy mutableCopy retain weak strong

NSString 与 NSMutableString NSString是不可变字符串对象,这句话的意思,结合代码: #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { NSString *str = @"Shaw"; NSString *str1 = @"Root"; // NSString *str1的意思是str1

Copy constructor拷贝构造函数

翻译的是wikipedia关于copy constructor,地址:点击打开链接 拷贝构造函数是C++语言中用一个已有对象创建一个新对象的特殊构造函数,该函数的第一个参数必须是函数所在类型的引用(译注:const/non-const都可以,可以有多个参数剩余参数必须有默认值,一定要是引用,这些原因见后,问:有多个参数拷贝构造如何调用?). 通常编译器会自动为每一个class创建一个拷贝构造函数(显示拷贝构造);有些情况下程序员自定义了拷贝构造函数(用户自定义拷贝构造),这时编译器不合成拷贝构造

Item 12:完整地拷贝对象(拷贝构造函数、复制运算符) Effective C++笔记

Item 12: Copy all parts of an object 在一个成熟的面向对象的C++系统中,只有两种拷贝对象的方式:复制构造函数和赋值运算符, 不妨称他们为拷贝函数. 拷贝函数属于编译器默认生成的函数(参考:Item 5:那些被C++默默地声明和调用的函数), 默认的拷贝函数确实会完整地拷贝对象,但有时我们选择重载拷贝函数,问题就出在这里! 一个正确拷贝函数的实现是这样的: class Customer{ string name; public: Customer::Custo

拷贝对象属性

        /**  * 拷贝属性到目标对象,如果为空不拷贝,目标对象属性有值,则不拷贝该属性  *   * @param source  *            待拷贝属性的对象  * @param target  *            目标对象  * @throws BeansException  */ public static void copyPropertiesExclude(Object source, Object target) throws BeansExcepti

Java 使用反射拷贝对象一般字段值

在<Java解惑>上面看到第八十三例--诵读困难者,要求使用非反射实现单例对象的拷贝.查阅了部分资料,先实现通过反射拷贝对象. 1. 编写需要被拷贝的对象Person package com.scl.j2se.reflectjavabean; public class Person { public String getName() { return name; } public void setName(String name) { this.name = name; } public St