OC Copy and MutableCopy的使用
- #import <Foundation/Foundation.h>
- @interface Student : NSObject <NSCopying>
- // copy代表set方法会release旧对象、copy新对象
- // 修改外面的变量,并不会影响到内部的成员变量
- // 建议:NSString一般用copy策略,其他对象一般用retain
- @property (nonatomic, copy) NSString *name;
- + (id)studentWithName:(NSString *)name;
- @end
- #import <Foundation/Foundation.h>
- #import "Student.h"
- #import "GoodStudent.h"
- // copy语法的目的:改变副本的时候,不会影响到源对象
- #pragma mark 演示字符串的拷贝(深拷贝)
- // 深拷贝:内容拷贝,会产生新的对象。新对象计数器置为1,源对象计数器不变。
- void stringMutableCopy() {
- // string:1
- NSString *string = [[NSString alloc] initWithFormat:@"age is %i", ];
- // 产生了一个新的对象,计数器为1。源对象的计数器不变。
- // str:1
- // string:1
- NSMutableString *str = [string mutableCopy];
- //NSLog(@"str:%zi", [str retainCount]);
- //NSLog(@"string:%zi", [string retainCount]);
- // str和string不是相同对象
- // NSLog(@"%i", str == string);
- [str appendString:@" abcd"];
- NSLog(@"string:%@", string);
- NSLog(@"str:%@", str);
- // str:0
- [str release];
- // string:0
- [string release];
- }
- #pragma mark 演示字符串的拷贝(浅拷贝)
- // 只有一种情况是浅拷贝:不可变对象调用copy方法时
- // 浅拷贝:指针拷贝,不会产生新的对象。源对象计数器+1。
- void stringCopy() {
- NSString *string = [[NSString alloc] initWithFormat:@"age is %i", ];
- NSLog(@"%zi", [string retainCount]);
- // copy产生的是不可变副本,由于源对象本身就不可变,所以为了性能着想,copy会直接返回源对象本身
- // 源对象计数器会+1
- // 在浅拷贝情况下,copy其实就相当于retain
- NSString *str = [string copy];
- NSLog(@"%zi", [string retainCount]);
- // NSLog(@"%i", str == string);
- [str release];
- [string release];
- }
- #pragma mark 可变字符串的copy(深拷贝)
- void mutableStringCopy() {
- NSMutableString *string = [NSMutableString stringWithFormat:@"age is %i", ];
- // 会产生一个新对象,str计数器为1
- NSString *str = [string copy];
- [str release];
- }
- #pragma mark 可变字符串的MutableCopy(深拷贝)
- void mutableStringMutableCopy() {
- NSMutableString *string = [NSMutableString stringWithFormat:@"age is %i", ];
- // 会产生一个新对象,str计数器为1
- NSMutableString *str = [string mutableCopy];
- [str appendString:@""];
- NSLog(@"str:%@", str);
- NSLog(@"string:%@", string);
- [str release];
- }
- #pragma mark 演示Student的name的copy
- void studentNameCopy() {
- Student *stu = [[[Student alloc] init] autorelease];
- NSMutableString *string = [NSMutableString stringWithFormat:@"age is %i", ];
- stu.name = string;
- [string appendString:@"abcd"];
- NSLog(@"name=%@", stu.name);
- NSLog(@"string=%@", string);
- }
- #pragma mark 演示Student的copy
- void studentCopy() {
- Student *stu1 = [Student studentWithName:@"stu1"];
- Student *stu2 = [stu1 copy];
- stu2.name = @"stu2";
- NSLog(@"stu1:%@", stu1);
- NSLog(@"stu2:%@", stu2);
- [stu2 release];
- }
- void goodStudentCopy() {
- GoodStudent *stu1 = [GoodStudent goodStudentWithAge: name:@"good1"];
- GoodStudent *stu2 = [stu1 copy];
- stu2.name = @"good2";
- stu2.age = ;
- NSLog(@"stu1:%@", stu1);
- NSLog(@"stu2:%@", stu2);
- }
- int main(int argc, const char * argv[])
- {
- @autoreleasepool {
- goodStudentCopy();
- }
- return ;
- }
OC Copy and MutableCopy的使用的更多相关文章
- OC copy mutableCopy, 浅拷贝,深拷贝
copy与mutableCopy都是深拷贝,区别是mutableCopy拷贝出的对象是可变的. OC对象基本都是通过指针访问,所以一般情况下,通过对指针的赋值都是浅拷贝,即只是拷贝了一份对象的指针,对 ...
- copy和mutableCopy的深、浅拷贝
对象拷贝主要由两种方式:copy和mutableCopy.浅拷贝是指直接将指针指向原有的地址,从而达到复制的目的.深拷贝是指重新生成一个对象,将原有对象的内容复制到新的对象中.copy 返回的是一个不 ...
- OC Copy基本使用(深拷贝和浅拷贝)
首先,什么是copy? Copy的字面意思是“复制”.“拷贝”,是一个产生副本的过程. 常见的复制有:文件复制,作用是利用一个源文件产生一个副本文件. 特点:1.修改源文件的内容,不会影响副本文件: ...
- Objective-C中的Strong、Copy与MutableCopy
面试过程中经常被问到ARC中Strong.Copy的区别是什么.普通的回答是:一样.文艺(正确)的回答是:分情况(我擦!WQY#$&Y**%OWEUR) 可以先参考这篇文章http://www ...
- 对copy、mutableCopy理解
Objective - C 中有很多在日常项目中经常用到的常用代码,在这里着重的讲一下关于copy 和 mutableCopy 的区别以及相关用法. Objective - C 中可变对象和不可对象经 ...
- 集合使用copy与mutableCopy的区别
集合(NSArray,NSSet,NSDictionary等)使用copy与mutableCopy的区别是类似的,下面以NSMutableArray.NSArray 为例子验证如下: NSMutabl ...
- iOS - OC Copy 拷贝
前言 copy:需要先实现 NSCopying 协议,创建的是不可变副本. mutableCopy:需要实现 NSMutableCopying 协议,创建的是可变副本. 浅拷贝:指针拷贝,源对象和副本 ...
- 探讨NSString和NSMutableString的内存问题以及copy和MutableCopy两个方法
NSString: //main.m #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { ...
- NSArray和NSMutableArray的copy和MutableCopy
NSArray: //main.m #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { ...
随机推荐
- imx6. android6.0经常修改或者用到的目录(未完)
系统应用apk存放的文件: out/target/product/sabresd_6dq/system/app 系统配置存放目录:(我自己的,也许不对) out/target/product/sabr ...
- Spring初始化日志
Spring启动时的日志: 2013-11-22 14:55:59:319[INFO]: FrameworkServlet 'spring3': initialization completed in ...
- Android 屏蔽recent task 按钮
Step 1 Add this permission to the manifest.xml file <uses-permission android:name="android.p ...
- PDF文件比对工具
tex/PDF对比工具讨论:https://tex.stackexchange.com/questions/65453/track-changes-in-latex 如果有源文件,直接用latexpa ...
- JS闭包、作用域链、垃圾回收、内存泄露相关知识小结
补充: 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 闭包的三个特性: 1.函数嵌套函数 2.函数内部可以引用外部的参数和变量 3.参数和变 ...
- Javaee的Dao层的抽取
有时候我们在实现不同功能的时候回看到很多的Dao层的增加.修改.删除.查找都很相似,修改我们将他们提取BaseDao 一.提取前 1. 提取前的LinkDao层: public interface L ...
- ecs CentOS 7 安装 mariadb
检查之前是否已经安装 rpm -qa | grep mariadb 如果已安装,卸载 yum remove mysql mysql-server mysql-libs compat-mysql51 开 ...
- 基于bootstrap的内容折叠功能
加入js及css支持: <link rel="stylesheet" href="css/bootstrap.min.css"/> <scri ...
- eclipse Java类 红色感叹号 commit失败
解决方法: 1.进入java类文件所在物理目录 (e:\workspace\myproject\...) 2. 删除多余的版本管理工具的文件或文件夹(如 .svn) 3. 刷新eclipse工程 4 ...
- 洛谷11月月赛题解(A-C)
心路历程 辣鸡T3卡我1.5h题意,要不是最后nlh跟我解释了一下大样例估计这次是真凉透了.. A P4994 终于结束的起点 打出暴力来发现跑的过最大数据?? 保险起见还是去oeis了一波,然后被告 ...