不是所有的对象都支持 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方法的更多相关文章

  1. HTTP协议和SOCKS5协议

    HTTP协议和SOCKS5协议 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们平时上网的时候基本上是离不开浏览器的,尤其是搜索资料的时候,那么这个浏览器是如何工作的呢?用的又是 ...

  2. 页面解耦—— 统跳协议和Rewrite引擎

    原文: http://pingguohe.net/2015/11/24/Navigator-and-Rewrite.html 解耦神器 —— 统跳协议和Rewrite引擎 Nov 24, 2015 • ...

  3. http协议和web应用有状态和无状态浅析

    http协议和web应用有状态和无状态浅析 (2013-10-14 10:38:06) 转载▼ 标签: it   我们通常说的web应用程序的无状态性的含义是什么呢? 直观的说,“每次的请求都是独立的 ...

  4. 在线聊天室的实现(1)--websocket协议和javascript版的api

    前言: 大家刚学socket编程的时候, 往往以聊天室作为学习DEMO, 实现简单且上手容易. 该Demo被不同语言实现和演绎, 网上相关资料亦不胜枚举. 以至于很多技术书籍在讲解网络相关的编程时, ...

  5. 从经典问题来看 Copy 方法(转)

    来自:Gua | 瓜地 链接:https://desgard.com/copy/  在初学 iOS 的时候,可能会被灌输这么一个常识,切记 NSString 的 property 的修饰变量要写作 c ...

  6. Bytom BIP-32协议和BIP-44协议

    我们知道HD(分层确定性)钱包,基于 BIP-32:多币种和多帐户钱包,基于 BIP-44:最近比原社区的钱包开发者对比原的BIP-32和BIP-44协议有疑问,所以我今天就专门整理了一下该协议的内容 ...

  7. python 全栈开发,Day33(tcp协议和udp协议,互联网协议与osi模型,socket概念,套接字(socket)初使用)

    先来回顾一下昨天的内容 网络编程开发架构 B/S C/S架构网卡 mac地址网段 ip地址 : 表示了一台电脑在网络中的位置 子网掩码 : ip和子网掩码按位与得到网段 网关ip : 内置在路由器中的 ...

  8. http协议和https协议

    内容: 1.http协议介绍 2.https协议介绍 3.http协议和https协议对比 1.http协议介绍 (1)http协议是什么 1 一个传输协议,协议就是双方都遵守的规范. 2 为什么叫超 ...

  9. (1)基于tcp协议的编程模型 (2)tcp协议和udp协议的比较 (3)基于udp协议的编程模型 (4)反射机制

    1.基于tcp协议的编程模型(重中之重)1.1 编程模型服务器: (1)创建ServerSocket类型的对象,并提供端口号: (2)等待客户端的连接请求,调用accept()方法: (3)使用输入输 ...

随机推荐

  1. 【Linux学习】Linux文件系统3—文件操作命令

    Linux文件系统3-文件操作命令 Linux文件操作命令主要有: cd:    改变目录位置 pwd:  显示当前目录的绝对路径 ls:    显示文件名称.属性等 -a 列出全部文件 -l  列出 ...

  2. 技术胖Flutter第三季-18布局CardWidget 卡片布局组件

    技术胖Flutter第三季-18布局CardWidget 卡片布局组件 博客地址: https://jspang.com/post/flutter3.html#toc-420 最外面是Card布局,里 ...

  3. HTML学习笔记(一)HTML的一些概念区别

    HTML HTML 指超文本标记语言.在 HTML 4 中,有若干的标签和属性是被废弃的,替换成style对应的属性 应该避免使用下面这些标签和属性: 标签 描述 style <center&g ...

  4. 《剑指offer》面试题13—O(1)时间删除链表结点

    题目:给定单向链表的头指针和某结点指针,实现函数在O(1)时间内删除指定节点. 思路:由于没有要删除结点(j结点)的前一个结点(i结点)指针,通常想法是从头开始遍历找到指定结点的前一个结点(i结点), ...

  5. node中的url模块解析结果

    1. URL模块作用: url 模块用于处理与解析 URL. 使用方法如下: const url = require('url'); 2. URL 字符串与 URL 对象 URL 字符串是结构化的字符 ...

  6. Solve Tree Problems Recursively

    "Top-down" Solution Here is the pseudocode for the recursion function maximum_depth(root, ...

  7. 51nod 1099【贪心】

    思路: 我们可以思考对于仅仅两个元素来说,A,B; 先选A的话是会  A.b+B.a; 先选B的话是会 B.b+A.a; 所以哪个小哪个就放前面; #include <cstdio> #i ...

  8. 洛谷P2824 [HEOI2016/TJOI2016]排序(线段树)

    传送门 这题的思路好清奇 因为只有一次查询,我们考虑二分这个值为多少 将原序列转化为一个$01$序列,如果原序列上的值大于$mid$则为$1$否则为$0$ 那么排序就可以用线段树优化,设该区间内$1$ ...

  9. 类的property特性

    目录 什么是 property特性 简单示例 property属性的两种方式 装饰器 类属性方式 property+类的封装 应用 私有属性添加getter和setter方法 使用property升级 ...

  10. PyInstaller 库

    将.py 源代码转换成无需源代码的可执行文件 首先,PyInstaller是第三方库,需要下载额外安装(安装第三方库需要使用pip工具) 步骤: 1.用管理员运行cmd命令行 "pip in ...