Objective-C:浅复制(拷贝)

简介:

浅复制:复制对象时,如果对象中包含对象类型的实例变量,只是复制指针。新对象中的对象类型实例变量和旧对象中的对象类型实例变量指的是同一个对象。任何一方实例变量对对象做修改,另一方实例变量指向的该对象也就改变了。

  .h声明文件

复制代码
 1 //  Person.h
 2 //  03-对象复制
 3 //
 4 //  Created by ma c on 15/8/14.
 5 //  Copyright (c) 2015年. All rights reserved.
 6 //
 7 
 8 #import <Foundation/Foundation.h>
 9 
10 @interface Person : NSObject<NSCopying>//实现NSCopying协议才能支持自定义对象的复制

11 @property(nonatomic,retain)NSMutableString *name;//(retain)浅拷贝,拷贝对象的引用,其实用的还是一个对象,相当于一个人给自己起了一个别名
12 @property(nonatomic,assign)NSInteger age;
13 -(id)initWithName:(NSMutableString*)name andAge:(NSInteger)age;
14 -(void)show;
15 @end
复制代码

  .m实现文件

复制代码
 1 //  Person.m
 2 //  03-对象复制
 3 //
 4 //  Created by ma c on 15/8/14.
 5 //  Copyright (c) 2015年. All rights reserved.
 6 //
 7 
 8 #import "Person.h"
 9 
10 @implementation Person
11 -(id)initWithName:(NSMutableString*)name andAge:(NSInteger)age
12 {
13     self = [super init];
14     if(self)
15     {
16         _name = [name retain];//强引用,获得对象所有权
17         _age = age;
18     }
19     return self;
20 }
21 -(void)show
22 {
23     NSLog(@"name:%@,age:%lu",_name,_age);
24 }
25 -(void)dealloc
26 {
27     [_name release];
28     [super dealloc];
29 }
30 -(id)copyWithZone:(NSZone *)zone
31 {
32     return [[Person alloc]initWithName:_name andAge:_age];
33 }
34 @end
复制代码

   main.m主函数

复制代码
 1 //  main.m
 2 //  03-对象复制
 3 //
 4 //  Created by ma c on 15/8/14.
 5 //  Copyright (c) 2015年. All rights reserved.
 6 //
 7 
 8 #import <Foundation/Foundation.h>
 9 #import "Person.h"
10 int main(int argc, const char * argv[]) {
11     @autoreleasepool {
12         // 测试Person类
13         NSMutableString *name = [NSMutableString stringWithString:@"Tom"];
14         
15         Person *p1 = [[Person alloc]initWithName:name andAge:20];
16         [p1 show];
17         
18         [name appendString:@"Jerry"];
19         
20         Person *p2 = [[Person alloc]initWithName:name andAge:21];
21         [p2 show];
22         
23         [p1 show];
24         
25         //对象复制,自定义对象必须要实现NSCopying协议才能支持对象复制
26         Person *p3 = [p1 copy];
27         [p3 show];
28         
29         [p1.name appendString:@"123"];//因为retain,p1和p2指向同一对象,一改都改
30         [p3 show];
31         
32         NSMutableString *name2 = [NSMutableString stringWithString:@"Jobs"];
33         [p1 setName:name2];//p1和p3指向的是不同的对象,互不影响
34         [p3 show];
35         
36         [p1 release];
37         [p2 release];
38         [p3 release];
39     }
40     return 0;
41 }
复制代码

  测试结果如下:

复制代码
2015-08-14 16:40:59.293 03-对象复制[1460:96685] name:Tom,age:20  
2015-08-14 16:40:59.294 03-对象复制[1460:96685] name:TomJerry,age:21
2015-08-14 16:40:59.294 03-对象复制[1460:96685] name:TomJerry,age:20
2015-08-14 16:40:59.295 03-对象复制[1460:96685] name:TomJerry,age:20
2015-08-14 16:40:59.295 03-对象复制[1460:96685] name:TomJerry123,age:20
2015-08-14 16:40:59.295 03-对象复制[1460:96685] name:TomJerry123,age:20
Program ended with exit code: 0
复制代码

 

程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!


本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/4730496.html,如需转载请自行联系原作者
目录
相关文章
|
6月前
|
安全 编译器 Swift
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
404 2
|
4月前
|
开发工具 iOS开发 容器
【Azure Blob】关闭Blob 匿名访问,iOS Objective-C SDK连接Storage Account报错
iOS Objective-C 应用连接Azure Storage时,若不关闭账号的匿名访问,程序能正常运行。但关闭匿名访问后,上传到容器时会出现错误:“Public access is not permitted”。解决方法是将创建容器时的公共访问类型从`AZSContainerPublicAccessTypeContainer`改为`AZSContainerPublicAccessTypeOff`,以确保通过授权请求访问。
【Azure Blob】关闭Blob 匿名访问,iOS Objective-C SDK连接Storage Account报错
|
6月前
|
缓存 开发工具 iOS开发
优化iOS中Objective-C代码调起支付流程的速度
优化iOS中Objective-C代码调起支付流程的速度
108 2
|
6月前
|
安全 JavaScript 前端开发
IOS开发基础知识:介绍一下 Swift 和 Objective-C,它们之间有什么区别?
IOS开发基础知识:介绍一下 Swift 和 Objective-C,它们之间有什么区别?
276 0
|
iOS开发 容器
iOS 代码规范格式 Objective-C(上)
iOS 代码规范格式 Objective-C
434 0
iOS 代码规范格式 Objective-C(上)
|
编译器 API iOS开发
iOS 代码规范格式 Objective-C(下)
iOS 代码规范格式 Objective-C(下)
238 0
|
机器学习/深度学习 API iOS开发
【IOS 开发】Objective-C Foundation 框架 -- 字符串 | 日期 | 对象复制 | NSArray | NSSet | NSDictionary | 谓词(一)
【IOS 开发】Objective-C Foundation 框架 -- 字符串 | 日期 | 对象复制 | NSArray | NSSet | NSDictionary | 谓词(一)
178 0
|
存储 自然语言处理 Java
【IOS 开发】Objective-C Foundation 框架 -- 字符串 | 日期 | 对象复制 | NSArray | NSSet | NSDictionary | 谓词(二)
【IOS 开发】Objective-C Foundation 框架 -- 字符串 | 日期 | 对象复制 | NSArray | NSSet | NSDictionary | 谓词(二)
251 0