NSCopying协议和copy方法
不是所有的对象都支持 copy
需要继承NSCopying 协议(实现 copyWithZone: 方法)
同样,需要继承NSMutableCopying 协议才可以使用mutableCopy(实现 mutableCopyWithZone: 方法)
默认 NSObject没有实现这两个协议,但是 copy和mutableCopy这两个方法是NSObject定义的
这里要列举范例
//1.h @interface CommonObj : NSObject < NSCopying > @end @interface MyCObj : NSObject < NSCopying > @property ( nonatomic , copy ) CommonObj *obj; @end //1.m @implementation CommonObj - ( id )init { self = [ super init]; if ( self ) { } return self ; } - ( void )dealloc { [ super dealloc]; } - ( id )copyWithZone:( NSZone *)zone { CommonObj *result = [[[ self class ] allocWithZone:zone] init]; return result; } @end @implementation MyCObj @synthesize obj = _obj; - ( id )init { self = [ super init]; if ( self ) { self ->_obj = nil ; } return self ; } - ( void )dealloc { if ( self .obj) [ self ->_obj release]; [ super dealloc]; } - ( id )copyWithZone:( NSZone *)zone { MyCObj *result = [[[ self class ] allocWithZone:zone] init]; result->_obj = [ self ->_obj copy ]; return result; } @end //main.m - ( void )Test { CommonObj *a1 = [[CommonObj alloc] init]; CommonObj *a2 = [a1 copy ]; MyCObj *b1 = [[MyCObj alloc] init]; MyCObj *b2 = [b1 copy ]; [b2 release]; [b1 release]; [a2 release]; [a1 release]; } |
打印上述对象的地址,就会发现地址各不相同,retaincount = 1;
这里要注意类似NSString的类,比如:NSArray
NSString *t1 = @"hello";
NSString *t2 = [t1 copy];
打印地址,两个地址一模一样;NSArray对象也是同样。之所以会是同一地址,估计在常量或不可变这个属性上
小结:
这个就是C++下的拷贝构造函数的另类描述,目的在于拷贝。至于实现的拷贝是深度拷贝还是浅度拷贝,这是由实现者设计
NSCopying协议和copy方法的更多相关文章
- HTTP协议和SOCKS5协议
HTTP协议和SOCKS5协议 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们平时上网的时候基本上是离不开浏览器的,尤其是搜索资料的时候,那么这个浏览器是如何工作的呢?用的又是 ...
- 页面解耦—— 统跳协议和Rewrite引擎
原文: http://pingguohe.net/2015/11/24/Navigator-and-Rewrite.html 解耦神器 —— 统跳协议和Rewrite引擎 Nov 24, 2015 • ...
- http协议和web应用有状态和无状态浅析
http协议和web应用有状态和无状态浅析 (2013-10-14 10:38:06) 转载▼ 标签: it 我们通常说的web应用程序的无状态性的含义是什么呢? 直观的说,“每次的请求都是独立的 ...
- 在线聊天室的实现(1)--websocket协议和javascript版的api
前言: 大家刚学socket编程的时候, 往往以聊天室作为学习DEMO, 实现简单且上手容易. 该Demo被不同语言实现和演绎, 网上相关资料亦不胜枚举. 以至于很多技术书籍在讲解网络相关的编程时, ...
- 从经典问题来看 Copy 方法(转)
来自:Gua | 瓜地 链接:https://desgard.com/copy/ 在初学 iOS 的时候,可能会被灌输这么一个常识,切记 NSString 的 property 的修饰变量要写作 c ...
- Bytom BIP-32协议和BIP-44协议
我们知道HD(分层确定性)钱包,基于 BIP-32:多币种和多帐户钱包,基于 BIP-44:最近比原社区的钱包开发者对比原的BIP-32和BIP-44协议有疑问,所以我今天就专门整理了一下该协议的内容 ...
- python 全栈开发,Day33(tcp协议和udp协议,互联网协议与osi模型,socket概念,套接字(socket)初使用)
先来回顾一下昨天的内容 网络编程开发架构 B/S C/S架构网卡 mac地址网段 ip地址 : 表示了一台电脑在网络中的位置 子网掩码 : ip和子网掩码按位与得到网段 网关ip : 内置在路由器中的 ...
- http协议和https协议
内容: 1.http协议介绍 2.https协议介绍 3.http协议和https协议对比 1.http协议介绍 (1)http协议是什么 1 一个传输协议,协议就是双方都遵守的规范. 2 为什么叫超 ...
- (1)基于tcp协议的编程模型 (2)tcp协议和udp协议的比较 (3)基于udp协议的编程模型 (4)反射机制
1.基于tcp协议的编程模型(重中之重)1.1 编程模型服务器: (1)创建ServerSocket类型的对象,并提供端口号: (2)等待客户端的连接请求,调用accept()方法: (3)使用输入输 ...
随机推荐
- 参考手册(html css)
HTML CSS DOM XML DOM XML DOM Document JavaScript JavaScript RegExp JSP
- HDU2824【欧拉函数性质】
思路: 打表. 利用公式. 类似素数打表一样. #include<bits/stdc++.h> using namespace std; const int N=3e6+10; bool ...
- Unity3D asset bundle 格式简析
http://blog.codingnow.com/2014/08/unity3d_asset_bundle.html Unity3D 的 asset bundle 的格式并没有公开.但为了做更好的差 ...
- js对数组处理(数组里边相同元素提取成map)
1.数组里边相同元素提取成map,并以‘’,‘’分隔 例如:var arr = [{a:"xx",b:''xxx''},{a:"xxx",b:''xxxxx'' ...
- Java 时区(转)
http://blog.csdn.net/wangpeng047/article/details/8560690
- day03 内部类
- MySQL 索引及优化实战
https://blog.csdn.net/qq_21987433/article/details/79753551 https://tech.meituan.com/mysql_index.html ...
- scrapy框架中Spiders用法
scrapy框架中Spiders用法 Spider类定义了如何爬去某个网站,包括爬取的动作以及如何从网页内容中提取结构化的数据 总的来说spider就是定义爬取的动作以及分析某个网页 工作流程分析 以 ...
- IMG 的alt和title的区别(转自 百度空间--路云的世界)
图片标签img中alt与title的区别 图片标签img中alt与title的区别 可能很多新手在做站内优化的时候,不明白图片标签img中alt与title的区别,今天为大家说一下其中的区别. 大家可 ...
- Mass Change Queries Codeforces - 911G
https://codeforces.com/contest/911/problem/G 没想到线段树合并还能这么搞.. 对每个权值建一个线段树(动态开点),如果权值为k的线段树上第i位为1,那么表示 ...