Objective-C:深复制(拷贝)
深复制:复制对象时,如果对象中包含对象类型的实例变量,要对对象类型的实例变量也要做对象复制。新对象中的对象类型实例变量和旧对象中的对象类型实例变量指的是不同的对象。不管任何一方实例变量对对象做修改,都互相不影响对方所指向的对象的内容。
.h文件
// Person.h
// 03-对象复制
//
// Created by ma c on 15/8/14.
// Copyright (c) 2015年. All rights reserved.
// #import <Foundation/Foundation.h> @interface Person : NSObject<NSCopying>
@property(nonatomic,copy)NSMutableString *name;//(copy)深拷贝
@property(nonatomic,assign)NSInteger age;
-(id)initWithName:(NSMutableString*)name andAge:(NSInteger)age;
-(void)show;
@end
.m文件
// Person.m
// 03-对象复制
//
// Created by ma c on 15/8/14.
// Copyright (c) 2015年. All rights reserved.
// #import "Person.h" @implementation Person
-(id)initWithName:(NSMutableString*)name andAge:(NSInteger)age
{
self = [super init];
if(self)
{
//复制对象有两种,
//copy:复制出来的是一个不可变对象
//mutableCopy:复制出来的是一个可变对象 /*
对OC内置对象来说,内置类型有可变和不可变之分,
自定义的类没有这个区别,都是可变的。
*/
_name = [name mutableCopy];
_age = age;
}
return self;
}
-(void)show
{
NSLog(@"name:%@,age:%lu",_name,_age);
}
-(void)dealloc
{
[_name release];
[super dealloc];
}
-(id)copyWithZone:(NSZone *)zone
{
//深复制
//创建对象类型实例变量的副本
//NSMutableString *name = [_name copy];
return [[Person alloc]initWithName:_name andAge:_age];
}
@end
.m主函数
// main.m
// 03-对象复制
//
// Created by ma c on 15/8/14.
// Copyright (c) 2015年. All rights reserved.
// #import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 测试Person类
NSMutableString *name = [NSMutableString stringWithString:@"Tom"]; Person *p1 = [[Person alloc]initWithName:name andAge:];
[p1 show]; [name appendString:@"Jerry"]; Person *p2 = [[Person alloc]initWithName:name andAge:];
[p2 show]; [p1 show]; //对象复制,自定义对象必须要实现NSCopying协议才能支持对象复制
Person *p3 = [p1 copy];
[p3 show]; [p1.name appendString:@""];//因为copy,p1和p2指向不同对象,互不影响
[p3 show]; NSMutableString *name2 = [NSMutableString stringWithString:@"Jobs"];
[p1 setName:name2];//p1和p3指向的是不同的对象,互不影响
[p3 show]; [p1 release];
[p2 release];
[p3 release];
}
return ;
}
测试结果如下:
-- ::53.912 -对象复制[:] name:Tom,age:
-- ::53.913 -对象复制[:] name:TomJerry,age:
-- ::53.913 -对象复制[:] name:Tom,age:
-- ::53.913 -对象复制[:] name:Tom,age:
-- ::53.914 -对象复制[:] name:Tom,age:
-- ::53.914 -对象复制[:] name:Tom,age:
Program ended with exit code:
Objective-C:深复制(拷贝)的更多相关文章
- Objective-C:OC内部可变对象和不可变对象的深(复制)拷贝问题思考:
OC内部:可变对象和不可变对象的深(复制)拷贝问题思考: 不可变对象: 例如NSString对象,因为NSString对象是常量字符串,所以,不可以更改其内容,但是可以修改指向该字符串的指针指向 ...
- iOS 浅复制和深复制的深层理解,含示例
转载:https://www.zybuluo.com/MicroCai/note/50592 版权归 @MicroCai 所有 以下是正文: 浅复制就是指针拷贝:深复制就是内容拷贝. 集合的浅复制 ( ...
- python中深复制与浅复制
转载:http://blog.csdn.net/vicken520/article/details/8227524 java中也经常碰见这种问题.时间原因就不写java方面啦 Python深复制浅复制 ...
- 详谈OC(object-c)深浅复制/拷贝-什么情况下用retain和copy
读前小提示:对于深浅复制有一个清楚的了解,对于学习oc的朋友来说,至关重要.那么首先,我们要明白深浅复制是如何定义的呢.这里为了便于朋友们理解,定义如下. 浅 复 制:在复制操作时,对于被复制的对象的 ...
- JAVA深复制(深克隆)与浅复制(浅克隆)
1.浅复制与深复制概念⑴浅复制(浅克隆)被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不 复制它所引用的对象. 1. ...
- iOS 浅复制、深复制、完全复制的知识点梳理验证(附加归档解档)
在之前转载的一片文章中,文中对浅复制和深复制进行了详细的解读,同时还提到了深复制(one-level-deep copy).完全复制(true copy)的概念,并指出iOS开发中的深复制是单层深赋值 ...
- iOS 集合的深复制与浅复制
概念 对象拷贝有两种方式:浅复制和深复制.顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针:深复制是直接拷贝整个对象内存到另一块内存中. 一图以蔽之 再简单些说:浅复制就是指针拷贝:深复制 ...
- Java中对象的深复制和浅复制详解
1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵ ...
- Java中的浅复制和深复制 Cloneable clone
先看一个简单案例 public class Test { public static void main(String args[]) { Student stu1 = new ...
随机推荐
- 7-1 FireTruck 消防车 uva208
题意: 输入一个n <=20 个结点的无向图以及某个结点k 按照字典序从小到大顺序输出从结点1到结点k的所有路径 要求结点不能重复经过 标准回溯法 要实现从小到大字典序 现在数组中排序好即 ...
- PHP 博客收集
https://lvwenhan.com/ www.chrisyue.com https://silex.symfony.com/ https://www.chrisyue.com/translati ...
- java的组合和继承
其实我第一次学习java 的时候根本没有听说过组合这个名词,老师也更没有讲解过,我一直以为是我自己落掉了什么知识点,其实不是的,组合这个名词暂且把它定义为一个思维性的东西吧,相信读者都接触过了,但是并 ...
- cloudstack api调用python
通过python调用cloudstack接口,cloudstack 接口通过 admin key来判断是否有访问有权访问 #!/usr/bin/env python import urllib2 ...
- python opencv3 滤波器 卷积核
git:https://github.com/linyi0604/Computer-Vision # coding:utf8 import cv2 import numpy as np from sc ...
- 机器学习之路: tensorflow 自定义 损失函数
git: https://github.com/linyi0604/MachineLearning/tree/master/07_tensorflow/ import tensorflow as tf ...
- centos+uwsgi+nginx+python+django服务器安装配置
1.ssh登录后使用fdisk –l查看需要格式化硬盘的名称: 2.运行fdisk /dev/vdb,对数据盘进行分区,按照提示,依次输入n,p,1,两次回车,wq,分区开始.(注意数据盘的名称,和阿 ...
- 「WC2016」挑战NPC
「WC2016」挑战NPC 解题思路 这个题建图非常厉害,带花树什么的只会口胡根本写不动,所以我写了机房某大佬教我的乱搞. 考虑把一个筐 \(x\) 拆成 \(x1,x2,x3\) 三个点,且这三个点 ...
- 鸟哥的私房菜:Bash shell(二)-变量的丰富功能
一 Shell变量的取用与设定,变量规则 由于系统需要一些变量来提供他数据的存取,所以就有一些所谓的『环境变量』 需要来读入系统中了!这些环境变量例如 PATH.HOME.MAIL.SHELL.为了 ...
- TF-timeline的使用经验记录
timeline的使用经验记录:https://towardsdatascience.com/howto-profile-tensorflow-1a49fb18073d 看了TF-summit2018 ...