面试过程中经常被问到ARC中Strong、Copy的区别是什么。普通的回答是:一样。文艺(正确)的回答是:分情况(我擦!WQY#$&Y**%OWEUR)

可以先参考这篇文章http://www.cnblogs.com/lihaiyin/p/4647426.html

问题一:到底用Copy还是Strong

1. 把不可变对象写成Copy:   如果把不可变对象赋值给此属性,内存中其实就是retain了一下。 如果把可变对象赋值给此属性,会生成新的不可变对象,避免值的变化

2. 把不可变对象写成Strong: 如果把不可变对象赋值给此属性,内存中其实就是retain了一下。 如果把可变对象赋值给此属性,会导致赋值后的内容依然可变

3. 把可变对象写成Strong:   如果把不可变对象赋值给此属性,调用此对象的addXX等增、删的方法时会崩溃。如果把可变对象赋值给此属性,内存中其实就是retain了一下。

4. 把可变对象写成Copy:     无论是谁赋值给此属性,都会调用Copy生成不可变对象,都会在调用此对象的addXX等增、删的方法时会崩溃

因此,我们的代码中一般都会  把不可变对象写成Copy  把可变对象写成Strong

问题二:源码中的Copy方法为什么copyItem的参数是YES?

/**
* Returns a new copy of the receiver.<br />
* The default abstract implementation of a copy is to use the
* -initWithArray:copyItems: method with the flag set to YES.<br />
* Immutable subclasses generally simply retain and return the receiver.
*/
- (id) copyWithZone: (NSZone*)zone
{
NSArray *copy = [NSArrayClass allocWithZone: zone]; return [copy initWithArray: self copyItems: YES];
} /**
* Returns an NSMutableArray instance containing the same objects as
* the receiver.<br />
* The default implementation does this by calling the
* -initWithArray:copyItems: method on a newly created object,
* and passing it NO to tell it just to retain the items.
*/
- (id) mutableCopyWithZone: (NSZone*)zone
{
NSMutableArray *copy = [NSMutableArrayClass allocWithZone: zone]; return [copy initWithArray: self copyItems: NO];
}

对比一下,发现initWithArray:copyItems方法的参数很怪。都知道,无论NSArray是copy还是mutableCopy,item都是retain的,不会copy,那为啥copyWithZone方法(copy方法调用时会调用此方法)的实现中,copyItem的参数是YES?

-initWithArray:copyItems: method with the flag set to YES.<br />
* Immutable subclasses generally simply retain and return the receiver

想了很久,后来发现,答案就在注释中,不可变子类(NSString、NSArray、NSDictionary)一般只是简单的retain。。。对不可变对象调用copy只是retain,对可变对象调用copy会生成不可变对象,所以,为了使得新生成的NSArray“不可变”(元素本身也要不可变),只能使用copy,但这里的copy并非为item生成了新的对象,只是为了生成“不可变”的对象

Objective-C中的Strong、Copy与MutableCopy的更多相关文章

  1. OC中@property属性关键字的使用(assign/weak/strong/copy)

    OC中@property属性关键字的使用(assign/weak/strong/copy) 一.assign 用于 ‘基本数据类型’.‘枚举’.‘结构体’ 等非OC对象类型 eg:int.bool等 ...

  2. 对copy、mutableCopy理解

    Objective - C 中有很多在日常项目中经常用到的常用代码,在这里着重的讲一下关于copy 和 mutableCopy 的区别以及相关用法. Objective - C 中可变对象和不可对象经 ...

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

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

  4. [Objective-C] Copy 和 MutableCopy

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

  5. iOS copy 和 mutableCopy 学习

    (参考 iOS 52个技巧学习心得笔记 第二章 对象 , 消息, 运行期)的对象部分 关于Copy  有个经典问题”大部分的时候NSString的属性都是copy,那copy与strong的情况下到底 ...

  6. copy 和 MutableCopy

    1:copy拷贝得到的对象都是不可变对象,MutableCopy拷贝得到的对象都是可变对象.MutableCopy拷贝得到的对象都是新的对象,会重新分配内存地址,而copy拷贝的对象既可以是新对象,也 ...

  7. 探讨NSString和NSMutableString的内存问题以及copy和MutableCopy两个方法

    NSString: //main.m #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { ...

  8. NSArray和NSMutableArray的copy和MutableCopy

    NSArray: //main.m #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { ...

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

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

随机推荐

  1. F#之旅4 - 小实践之快排

    参考文章:https://swlaschin.gitbooks.io/fsharpforfunandprofit/content/posts/fvsc-quicksort.html F#之旅4 - 小 ...

  2. SPOJ - PLSQUARE Palin Squar(hash+回文串)

    题意:给你一个n*n (n<=200)的字符串矩阵,问你每行每列都是回文串的最大的m*m的矩阵是多少 题解:首先答案不满足单调性,即m成立而m-1与m+1都却不一定成立,所以必须枚举答案确定现在 ...

  3. [NHibernate]第一个NHibernate的应用配置

    NHibernate是.Net平台下一个成熟的,开源的对象关系映射器(ORM).本文来介绍第一次使用NHibernate的时候的配置. 1.下载NHibernate.Nhibernate官网最新版本为 ...

  4. JAVA 引入 junit工具框架

    我遇到的麻烦 : 开始直接按照视频上的来做,直接也是引入的他上面的jar ,但是我只引入了一个,就是上面的junit-4.4.jar,然后就会报错,会出现,空指针的错误, 后面我又按照网上的教程 这里 ...

  5. POJ No.3617【B008】

    [B007]Best Cow Line[难度B]———————————————————————————————————————————————— [Description    支持原版从我做起!!! ...

  6. 【刷题记录】首师附NOIP练习20160820

    [由于老师不让发题目,So只能发考点喽!!!!噜噜噜] [题目(嘘~~~~~)]:百度云下载 [T1]:好像是DP,路径压缩+排序+分情况处理100分(噜噜噜) [T2]:正解好难的样子,DFS乱搞了 ...

  7. a 标签中加 onclick事件,根据事件中的校验情况来决定是否执行a标签的链接

    a 标签中加 onclick方法后,先执行onclick方法,在去执行a标签href下属性对应的动作,如果不想执行href属性下动作需要用false作为返回值. <a href="ht ...

  8. Thread与Runnable的一个小陷阱

    Java里面运行一个线程可以通过继承Thread的方式,也可以通过实现Runnable的接口来实现,那么两者能不能混用呢,比如以下的例子: public class JavaTest extends ...

  9. Linux 学习记录

    整理学习Linux操作系统遇到的不理解的概念.逐个进行补充.我们用的版本是CentOs. what's the gcc? what's the yum? what's the wget?

  10. 浅谈ajax

    Ajax 回顾 最本质的 ajax 其实是这样的: function Ajax(){ var xmlHttpReq = null; if (window.ActiveXObject){//IE5 IE ...