到这里全部真相大白了,说明我们的copy修饰的array进行了浅拷贝,我们知道只有当不可变对象使用copy时才是浅拷贝,那我们copy修饰的是一个可变数组,赋值的是一个不可变数组。
创新互联公司是一家专业提供伊吾企业网站建设,专注与做网站、成都做网站、HTML5建站、小程序制作等业务。10年已为伊吾众多企业、政府机构等服务。创新互联专业的建站公司优惠进行中。
分析:strstr2地址相同并且与str3地址不同,NSString的copy是浅拷贝,且copy返回的对象是不可变对象;mutableCopy是深拷贝。
通俗解释:深拷贝是内容拷贝,浅拷贝是地址拷贝 区别点:深拷贝会创建一个新的内存空间,拷贝的值是一样的,但是内存地址不一样。
原因:这里的copy是浅拷贝,并没有生成新的对象 由上面的例子可以得出:但是,我们一般声明NSString时,也不希望它改变,所以一般情况下,建议使用 copy ,这样可以避免NSMutableString带来的错误。
浅拷贝:修改堆内存中的同一个值。深拷贝:修改堆内存中的不同的值。
copy: 用于希望保持一份传入值的拷贝,而不是值自身的情况,即把原来的对象完整的赋值到另外一地方,重新加载一内存区,一个地方变了不影响另一个地方的对象。
NSString title;什么是assign,copy,retain之间的区别?assign:简单赋值,不更改索引计数(Reference Counting)。
copy是创建一个新对象,retain是创建一个指针,引用对象计数加1。Copy属性表示两个对象内容相同,新的对象retain为1 ,与旧有对象的引用计数无关,旧有对象没有变化。copy减少对象对上下文的依赖。
系统默认属性是assign。retain是指针的复制,copy是内容的复制原子性修饰符:atomic nonatomicatomic:表示是线程安全的。nonatomic:表示是非线程安全的,使用此属性性能会提高一些。
原来简单解释过属性定义(Property),并且提起了简单的retain,copy,assign的区别。那究竟是有什么区别呢?assign就不用说了,因为基本上是为简单数据类型准备的,而不是NS对象们。
学习资料 首先iOS拷贝可以区分为 深拷贝 和 浅拷贝 。 浅拷贝 :拷贝了对象的指针,可以理解为给一条狗加了一条绳子。 深拷贝 :直接拷贝对象到另外一块内存地址中,可以理解为新买了一条狗。
浅拷贝就是拷贝指向原来对象的指针,使原对象的引用计数+1,可以理解为创建了一个指向原对象的新指针而已,并没有创建一个全新的对象。
用copy修饰的属性,在setter时,会先调用传入对象的copy方法得到一份拷贝后再retain,但不同的对象调用copy方法,可能是深拷贝也可能是浅拷贝,如果是浅拷贝,则两个指针指向一个内存,旧对象引用计数会加1。
深拷贝 :内容拷贝,拷贝数据到一块新内存区域,指针指向拷贝的数据区 strong: 浅拷贝,也就是指针引用,很明显的。我们来测试一下 运行结果如下,实际对象是一致的。
在llvm层,其实对 copy 属性做了编译器优化,之后才会调用 objc 中的 objc_setProperty_xxx 方法。
到这里全部真相大白了,说明我们的copy修饰的array进行了浅拷贝,我们知道只有当不可变对象使用copy时才是浅拷贝,那我们copy修饰的是一个可变数组,赋值的是一个不可变数组。
为了避免可变对象找不到方法crash,或者不可变对象被篡改,iOS中的不可变对象、容器一般都使用copy修饰符,保证setter方法中对传入的新对象调用copy方法。
block 本质上是一个OC对象,内部有个 isa 指针,可以用 retain/strong/copy 等修饰词修饰。但是 block 在创建的时候内存默认分配在栈上,而不是堆上的。
copy与strong类似。不同之处是strong的复制是多个指针指向同一个地址,而copy的复制每次会在内存中拷贝一份对象,指针指向不同地址。copy一般用在修饰有可变对应类型的不可变对象上,如NSString, NSArray, NSDictionary。
可以看到我们修改strCoptTest,拷贝对象也被修改了。
copy与strong类似。不同之处是strong的复制是多个指针指向同一个地址,而copy的复制每次会在内存中拷贝一份对象,指针指向不同地址。copy一般用在修饰有可变对应类型的不可变对象上,如NSString, NSArray, NSDictionary。
copy是创建一个新对象,retain是创建一个指针,引用对象计数加1。Copy属性表示两个对象内容相同,新的对象retain为1 ,与旧有对象的引用计数无关,旧有对象没有变化。copy减少对象对上下文的依赖。
也就是说,retain 是指针拷贝,copy 是内容拷贝。strong,weak 用来修饰属性。