1. #import <Foundation/Foundation.h>
  2.  
  3. @interface Student : NSObject <NSCopying>
  4.  
  5. // copy代表set方法会release旧对象、copy新对象
  6. // 修改外面的变量,并不会影响到内部的成员变量
  7. // 建议:NSString一般用copy策略,其他对象一般用retain
  8. @property (nonatomic, copy) NSString *name;
  9.  
  10. + (id)studentWithName:(NSString *)name;
  11.  
  12. @end
  1. #import <Foundation/Foundation.h>
  2. #import "Student.h"
  3. #import "GoodStudent.h"
  4.  
  5. // copy语法的目的:改变副本的时候,不会影响到源对象
  6.  
  7. #pragma mark 演示字符串的拷贝(深拷贝)
  8. // 深拷贝:内容拷贝,会产生新的对象。新对象计数器置为1,源对象计数器不变。
  9. void stringMutableCopy() {
  10. // string:1
  11. NSString *string = [[NSString alloc] initWithFormat:@"age is %i", ];
  12.  
  13. // 产生了一个新的对象,计数器为1。源对象的计数器不变。
  14. // str:1
  15. // string:1
  16. NSMutableString *str = [string mutableCopy];
  17. //NSLog(@"str:%zi", [str retainCount]);
  18. //NSLog(@"string:%zi", [string retainCount]);
  19.  
  20. // str和string不是相同对象
  21. // NSLog(@"%i", str == string);
  22.  
  23. [str appendString:@" abcd"];
  24.  
  25. NSLog(@"string:%@", string);
  26. NSLog(@"str:%@", str);
  27.  
  28. // str:0
  29. [str release];
  30. // string:0
  31. [string release];
  32. }
  33.  
  34. #pragma mark 演示字符串的拷贝(浅拷贝)
  35. // 只有一种情况是浅拷贝:不可变对象调用copy方法时
  36.  
  37. // 浅拷贝:指针拷贝,不会产生新的对象。源对象计数器+1。
  38. void stringCopy() {
  39. NSString *string = [[NSString alloc] initWithFormat:@"age is %i", ];
  40. NSLog(@"%zi", [string retainCount]);
  41.  
  42. // copy产生的是不可变副本,由于源对象本身就不可变,所以为了性能着想,copy会直接返回源对象本身
  43. // 源对象计数器会+1
  44. // 在浅拷贝情况下,copy其实就相当于retain
  45. NSString *str = [string copy];
  46. NSLog(@"%zi", [string retainCount]);
  47.  
  48. // NSLog(@"%i", str == string);
  49.  
  50. [str release];
  51. [string release];
  52. }
  53.  
  54. #pragma mark 可变字符串的copy(深拷贝)
  55. void mutableStringCopy() {
  56. NSMutableString *string = [NSMutableString stringWithFormat:@"age is %i", ];
  57.  
  58. // 会产生一个新对象,str计数器为1
  59. NSString *str = [string copy];
  60.  
  61. [str release];
  62. }
  63.  
  64. #pragma mark 可变字符串的MutableCopy(深拷贝)
  65. void mutableStringMutableCopy() {
  66. NSMutableString *string = [NSMutableString stringWithFormat:@"age is %i", ];
  67.  
  68. // 会产生一个新对象,str计数器为1
  69. NSMutableString *str = [string mutableCopy];
  70.  
  71. [str appendString:@""];
  72.  
  73. NSLog(@"str:%@", str);
  74. NSLog(@"string:%@", string);
  75.  
  76. [str release];
  77. }
  78.  
  79. #pragma mark 演示Studentnamecopy
  80. void studentNameCopy() {
  81. Student *stu = [[[Student alloc] init] autorelease];
  82.  
  83. NSMutableString *string = [NSMutableString stringWithFormat:@"age is %i", ];
  84.  
  85. stu.name = string;
  86.  
  87. [string appendString:@"abcd"];
  88.  
  89. NSLog(@"name=%@", stu.name);
  90. NSLog(@"string=%@", string);
  91. }
  92.  
  93. #pragma mark 演示Studentcopy
  94. void studentCopy() {
  95. Student *stu1 = [Student studentWithName:@"stu1"];
  96.  
  97. Student *stu2 = [stu1 copy];
  98. stu2.name = @"stu2";
  99.  
  100. NSLog(@"stu1:%@", stu1);
  101. NSLog(@"stu2:%@", stu2);
  102.  
  103. [stu2 release];
  104. }
  105.  
  106. void goodStudentCopy() {
  107. GoodStudent *stu1 = [GoodStudent goodStudentWithAge: name:@"good1"];
  108.  
  109. GoodStudent *stu2 = [stu1 copy];
  110. stu2.name = @"good2";
  111. stu2.age = ;
  112.  
  113. NSLog(@"stu1:%@", stu1);
  114. NSLog(@"stu2:%@", stu2);
  115. }
  116.  
  117. int main(int argc, const char * argv[])
  118. {
  119. @autoreleasepool {
  120. goodStudentCopy();
  121. }
  122. return ;
  123. }

OC Copy and MutableCopy的使用的更多相关文章

  1. OC copy mutableCopy, 浅拷贝,深拷贝

    copy与mutableCopy都是深拷贝,区别是mutableCopy拷贝出的对象是可变的. OC对象基本都是通过指针访问,所以一般情况下,通过对指针的赋值都是浅拷贝,即只是拷贝了一份对象的指针,对 ...

  2. copy和mutableCopy的深、浅拷贝

    对象拷贝主要由两种方式:copy和mutableCopy.浅拷贝是指直接将指针指向原有的地址,从而达到复制的目的.深拷贝是指重新生成一个对象,将原有对象的内容复制到新的对象中.copy 返回的是一个不 ...

  3. OC Copy基本使用(深拷贝和浅拷贝)

     首先,什么是copy? Copy的字面意思是“复制”.“拷贝”,是一个产生副本的过程. 常见的复制有:文件复制,作用是利用一个源文件产生一个副本文件. 特点:1.修改源文件的内容,不会影响副本文件: ...

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

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

  5. 对copy、mutableCopy理解

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

  6. 集合使用copy与mutableCopy的区别

    集合(NSArray,NSSet,NSDictionary等)使用copy与mutableCopy的区别是类似的,下面以NSMutableArray.NSArray 为例子验证如下: NSMutabl ...

  7. iOS - OC Copy 拷贝

    前言 copy:需要先实现 NSCopying 协议,创建的是不可变副本. mutableCopy:需要实现 NSMutableCopying 协议,创建的是可变副本. 浅拷贝:指针拷贝,源对象和副本 ...

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

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

  9. NSArray和NSMutableArray的copy和MutableCopy

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

随机推荐

  1. imx6. android6.0经常修改或者用到的目录(未完)

    系统应用apk存放的文件: out/target/product/sabresd_6dq/system/app 系统配置存放目录:(我自己的,也许不对) out/target/product/sabr ...

  2. Spring初始化日志

    Spring启动时的日志: 2013-11-22 14:55:59:319[INFO]: FrameworkServlet 'spring3': initialization completed in ...

  3. Android 屏蔽recent task 按钮

    Step 1 Add this permission to the manifest.xml file <uses-permission android:name="android.p ...

  4. PDF文件比对工具

    tex/PDF对比工具讨论:https://tex.stackexchange.com/questions/65453/track-changes-in-latex 如果有源文件,直接用latexpa ...

  5. JS闭包、作用域链、垃圾回收、内存泄露相关知识小结

    补充: 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 闭包的三个特性: 1.函数嵌套函数 2.函数内部可以引用外部的参数和变量 3.参数和变 ...

  6. Javaee的Dao层的抽取

    有时候我们在实现不同功能的时候回看到很多的Dao层的增加.修改.删除.查找都很相似,修改我们将他们提取BaseDao 一.提取前 1. 提取前的LinkDao层: public interface L ...

  7. ecs CentOS 7 安装 mariadb

    检查之前是否已经安装 rpm -qa | grep mariadb 如果已安装,卸载 yum remove mysql mysql-server mysql-libs compat-mysql51 开 ...

  8. 基于bootstrap的内容折叠功能

    加入js及css支持: <link rel="stylesheet" href="css/bootstrap.min.css"/> <scri ...

  9. eclipse Java类 红色感叹号 commit失败

    解决方法:  1.进入java类文件所在物理目录 (e:\workspace\myproject\...) 2. 删除多余的版本管理工具的文件或文件夹(如 .svn) 3. 刷新eclipse工程 4 ...

  10. 洛谷11月月赛题解(A-C)

    心路历程 辣鸡T3卡我1.5h题意,要不是最后nlh跟我解释了一下大样例估计这次是真凉透了.. A P4994 终于结束的起点 打出暴力来发现跑的过最大数据?? 保险起见还是去oeis了一波,然后被告 ...