(参考 iOS 52个技巧学习心得笔记 第二章 对象 , 消息, 运行期)的对象部分

关于Copy  有个经典问题”大部分的时候NSString的属性都是copy,那copy与strong的情况下到底有什么区别呢” 或者说”为什么 NSString 类型成员变量的修饰属性用 copy 而不是 strong (或 retain ) ?”

明显 第一句比第二句 严谨多了.

@property (strong,nonatomic) NSString *strongString; & @property (copy,nonatomic) NSString *copyString;

正确理解 应该是区分这两种表达方式的区别

不同写法,权限 不同 安全级别不同.

(1)如果是 一个 普通NSString 赋值给copyString 和 strongString  没区别,  copy 是浅拷贝, 对于二者的被赋值 都是指针引用

(2)如果是一个可变字符串NSMutableString 赋给copyString 和 strongString ,对于copyString则是深复制 不会跟着源头的变化而变化.而strongString 还是浅复制 是指针引用 会随着源头的变化而变化

其二,copy 和 mutableCopy

copy 是浅复制 , 简单指针引用,随源头的变化而变化 

multableCopy 是深复制,是创建了一个新的对象,不会随着源头变化而变化

以下 是一位网友得到的 的Runtime源码中NSMutableString.m实例方法

-(id)copy {
return [[NSString alloc] initWithString:self];
}
  -(id)copyWithZone:(NSZone*)zone {
    return [[NSString allocWithZone:zone] initWithString:self];
}
对于 NSObject.mm方法

- (id)copy {
return [(id)self copyWithZone:nil];
}
- (id)mutableCopy {
return [(id)self mutableCopyWithZone:nil];
} NSString.m调用 - (id)copyWithZone:(NSZone *)zone {
if (NSStringClass == Nil)
NSStringClass = [NSString class];
return RETAIN(self);
}
- (id)mutableCopyWithZone:(NSZone*)zone { return [[NSMutableString allocWithZone:zone] initWithString:self];
}

由此可见 在可变类型中 copy也是深复制,但是类型变成了 普通类型,不能再增加或者减少集合元素了

在普通类型中 使用mutableCopy 也是深复制,类型变成了 可变类型...

NSString *haha = @"hahahhahahah";
NSLog(@"%p\n%p",haha,[haha mutableCopy]);

2016-08-15 17:42:09.843 dailylife[69904:5024325] 0x10f6fa390

0x7f8079c41f80

Printing description of haha:

hahahhahahah

Printing description of haha:

hahahhahahah

Printing description of haha:

(NSMutableString) NSMutableString = {

NSString = {

NSObject = {

isa = __NSCFConstantString

}

}

}

同理:NSString  NSArray NSDictionary

参考:

https://searchcode.com/file/68838008/jni%20w:%20itoa%20runtime%20and%20allocator/Foundation/NSMutableString.m

http://ios.jobbole.com/87987/

iOS copy 和 mutableCopy 学习的更多相关文章

  1. iOS Copy 和 MutableCopy的区别 深浅拷贝的区别-供参考

    概述 对于系统的非容器类对象,对一不可变对象复制,copy是指针复制(浅拷贝)和mutableCopy就是对象复制(深拷贝).如果是对可变对象复制,都是深拷贝,但是copy返回的对象是不可变的. 对于 ...

  2. iOS copy和mutableCopy 整理

    copy 和 mutableCopy 你真的理解吗?最近发现很多面试者基本都不能很好地回答这个问题.所以整理一下. copy和mutableCopy的概念: copy 浅拷贝,不拷贝对象本身,仅仅是拷 ...

  3. iOS copy&mutableCopy理解

    Copy&mutableCopy   通过copy方法可以创建可变或不可变对象的不可变副本,通过mutableCopy可以创建可变或不可变对象的可变副本. 拷贝分为浅拷贝和深拷贝: 浅拷贝:指 ...

  4. iOS之NSArray类簇简介-(copy、mutableCopy导致程序crash)

    1.前言 开发时常常用数组对数据进行处理,对NSMutableArray进行操作时经常导致程序崩溃,特研究一下NSArray的类簇!涉及__NSPlaceholderArray.__NSArray0. ...

  5. 转载一篇关于ios copy的文章

    由于原文创作时间较早,一些内容不实用了,我对其进行了加工,去掉了一部分内容,添加了一点注释. 原文连接 http://www.cnblogs.com/ydhliphonedev/archive/201 ...

  6. 【转】copy 和 mutablecopy (深拷贝和浅拷贝)

    阅读本文之前首先了解copy与retain的区别,如果有不正确的地方望大家多多指教: copy与retain的区别: copy是创建一个新对象,retain是创建一个指针,引用对象计数加1.Copy属 ...

  7. 关于:1.指针与对象;2.深浅拷贝(复制);3.可变与不可变对象;4.copy与mutableCopy的一些理解

    最近对深浅拷贝(复制)做了一些研究,在此将自己的理解写下来,希望对大家有所帮助.本人尚处在摸索阶段,希望各位予以指正. 本文包括如下方向的探索: 1.指针与对象: 2.深/浅拷贝(复制): 3.可变/ ...

  8. [Objective-C] Copy 和 MutableCopy

    看了几篇文章,因为文章很新手向,所以内容很繁琐.故整理一下重点,写了测试程序去了解几个知识点,不讨论基本概念.新博客wossoneri.com传送门 非集合类对象的copy与mutableCopy / ...

  9. Objective-C中的Strong、Copy与MutableCopy

    面试过程中经常被问到ARC中Strong.Copy的区别是什么.普通的回答是:一样.文艺(正确)的回答是:分情况(我擦!WQY#$&Y**%OWEUR) 可以先参考这篇文章http://www ...

随机推荐

  1. mvn test中文乱码处理

    mvn test执行测试的时候调用的实际是maven-surefire-plugin插件因为mvn启动时会新建一个jvm进程,默认没有指定编码所以中文乱码了.启动时`<argLine>-D ...

  2. servlet 传值给 jsp

    java package helloworld; import java.io.IOException; import javax.servlet.RequestDispatcher; import ...

  3. cobbler 更换dns和dhcp服务器为dnsmasq

    1) 需要配置/etc/cobbler/module.conf, 把manage_dns和manage_dhcp改为manage_dnsmasq 2) 重启cobbler和dnsmasq服务,dnsm ...

  4. 大量数据导入导致mysql自动重启

    昨天晚上第十款做数据库迁移,数据库版本:Version: '5.1.61',数据量27G左右 message报错信息如下: Mar :: VM_163_210_tlinux kernel: [, oo ...

  5. python3----基础函数的参数是可变参数,将传进来的参数转成列表

    def myFun(*argments): values = [x for x in argments] print(values) myFun(1,2,3,4,5,6) result: [1, 2, ...

  6. python greenlet背景介绍与实现机制

    并发处理的技术背景 并行化处理目前很受重视, 因为在很多时候,并行计算能大大的提高系统吞吐量,尤其在现在多核多处理器的时代, 所以像lisp这种古老的语言又被人们重新拿了起来, 函数式编程也越来越流行 ...

  7. Nginx模块系列之auth_basic模块

    1.1 介绍 ngx_http_auth_basic_module模块实现让访问着,只有输入正确的用户密码才允许访问web内容.web上的一些内容不想被其他人知道,但是又想让部分人看到.nginx的h ...

  8. < 转载 > 说说JSON和JSONP

    推荐博文---说说JSON和JSONP,也许你会豁然开朗,含jQuery用例 里头说的很详细!

  9. 使用Volley缓存图片时,缓存无效的原因。

    使用Volley的ImageLoader异步获取并缓存图片时,发现有的网络图片已经缓存了,可是断网后却读不出来. ImageLoader的用法: RequestQueue requestQueue = ...

  10. ionic + cordova 环境搭建

    1.安装nodejs:官网下载安装包,双击安装即可.成功后在控制台输入node -v 显示版本号即成功. 2.安装Java,配置环境变量,下载安卓sdk ,配置环境变量 ANDROID_HOME 为s ...