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[]) { ...
随机推荐
- Hadoop科普文—常见的45个问题解答
1.Hadoop集群可以运行的3个模式? 单机(本地)模式 伪分布式模式 全分布式模式 2. 单机(本地)模式中的注意点? 在单机模式(standalone)中不会存在守护进程,所有东西都运行在一个 ...
- addEventListener()和removeEventListener()
作用: addEventListener()与removeEventListener()用于处理指定和删除事件处理程序操作. 它们都接受3个参数:事件名.事件处理的函数和布尔值. 布尔值参数是true ...
- MYSQL连接字符串参数解析(解释)
被迫转到MySQL数据库,发现读取数据库时,tinyint类型的值都被转化为boolean了,这样大于1的值都丢失,变成true了.查阅资料MySQL中无Boolean类型,都是存储为tinyint了 ...
- Hadoop实战之四~hadoop作业调度详解(2)
这篇文章将接着上一篇wordcount的例子,抽象出最简单的过程,一探MapReduce的运算过程中,其系统调度到底是如何运作的. 情况一:数据和运算分开的情况 wordcount这个例子的是hado ...
- vscode设置中文,设置中文不成功问题
刚安装好的vscode界面显示英文,如何设置中文呢? 在locale.json界面设置”locale":"zh-cn"也未能实现界面为中文,在网上找了参考了,以下教程真实 ...
- redis(5)持久化
一.持久化 计算机的数据有两种状态: 1)持久态:如硬盘上的数据 2)瞬时态:如内存当中的数据 持久化就是将瞬时数据转换为持久数据的一个过程,但注意持久化并不意味的数据永远存在,针对不同的持久化,数据 ...
- RabbitMQ如何解决各种情况下丢数据的问题
1.生产者丢数据 生产者的消息没有投递到MQ中怎么办?从生产者弄丢数据这个角度来看,RabbitMQ提供transaction和confirm模式来确保生产者不丢消息. transaction机制就是 ...
- 洛谷P3953 逛公园(dp 拓扑排序)
题意 题目链接 Sol 去年考NOIP的时候我好像连最短路计数都不会啊qwq.. 首先不难想到一个思路,\(f[i][j]\)表示到第\(i\)个节点,与最短路之差长度为\(j\)的路径的方案数 首先 ...
- Git Bash Here常用命令以及使用步骤
1.首先,要clone项目代码: git clone 链接地址 2.更新代码: git pull 3.添加修改过的文件.文件夹: git add 修改过的文件,文件夹 4.提交并注释: git com ...
- vim使用方法----转载
转载自:http://www.cnblogs.com/itech/archive/2009/04/17/1438439.html vi/vim 基本使用方法本文介绍了vi (vim)的基本使用方法,但 ...