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[]) { ...
随机推荐
- 那些年的Java学习笔记
1.1L是什么意思??L表示long ,long占用8个字节,表示范围:-9223372036854775808 ~ 9223372036854775807 1l就是1. 2.alt+shift+j ...
- 第八章使用java实现面向对象-File I/O
java.io.File类用于表示文件(目录) File类只用于表示文件(目录)的信息(名称.大小等),不能用于文件内容的访问 RandomAccessFile java提供的对文件内容的访问,既可以 ...
- Jquery UI Dialog 导致C#页面后台事件失效
$(function () { dialog = $("#dialog-form").dialog({ autoOpen: false, height: 450, width: 5 ...
- 流畅的python和cookbook学习笔记(六)
1.同时迭代多个序列(zip(函数)) 使用zip()函数可以同时迭代多个序列. >>> X = [1, 2, 3, 4, 5, 6] >>> Y = [121, ...
- Java Netty简介
Netty和Mina是Java世界非常知名的通讯框架.它们都出自同一个作者,Mina诞生略早,属于Apache基金会,而Netty开始在Jboss名下,后来出来自立门户netty.io(http:// ...
- C Primer Plus note3
上面的源代码为什么输入q的时候,程序就会退出呢? while(条件语句),status == 1是条件语句,status只要是非0值的时候,status == 1的条件就满足,程序就会运行while循 ...
- java利用直方图实现图片对比
需求 实现两张图对比,找出其中不同的部分. 分析 首先将大图切片,分成许多小图片.然后进行逐个对比,并设定相似度阈值,判断是否是相同.最后整理,根据生成数组标记不同部分.如果切片足够小,便越能精确找出 ...
- PHP三维优先级运算
昨天去某大型公司面试,做了一套面试题,整套面试题的基础要求比较高,对于js的使用有一定的要求.在本次面试中碰到PHP三维运算优先级的问题,先看题: <?php $b=20; $c=40; $a= ...
- 使用模块化工具打包自己开发的JS库(webpack/rollup)对比总结
打包JS库demo项目地址:https://github.com/BothEyes1993/bes-jstools 背景 最近有个需求,需要为小程序写一个SDK,监控小程序的后台接口调用和页面报错(类 ...
- 使用QQ第三方登录 并在父页面跳转刷新
<html> <head> <title>QQ登录跳转</title> <script src="http://lib.sinaapp. ...