#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的使用的更多相关文章

  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. poj 1284 Primitive Roots(未完)

    Primitive Roots Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3155   Accepted: 1817 D ...

  2. iOS 开发工具网页下载

    iOS 开发工具网页下载地址: https://developer.apple.com/downloads/

  3. js 获取 客户区 大小

    js 获取 客户区 大小 本文内容来自<javascript高级程序设计(第二版)> 内容, 只是方便大家以后可能会用到... <script type="text/jav ...

  4. access 2010

    access 2010(表4.1---4.5) 数据表视图创建表:创建----改ID一行的内容(字段----格式----数据类型----格式----字段大小)----完成. 设计视图创建表:创建--- ...

  5. JavaScript十大古怪之处(出自众妙之门)

    1. null是一个对象: alert(typeof null);  //objects NULL表示没有值,那么很明显他不能作为任何东西的实例,所以下式应该等于false: alert(null i ...

  6. JMS - 基于JMS的RPC

    现在试试通过JMS,在应用程序之间发送消息.先看看spring提供的RPC方案(其实还有其他方案,只是没见过谁用).需要使用到这两个类:·org.springframework.jms.remotin ...

  7. iframe适应屏幕大小,隐藏滚动条,移动端

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat=&qu ...

  8. 四、spring之DI

    Bean依赖容器,那容器如何注入Bean的依赖资源,Spring IOC容器注入依赖资源主要有以下两种基本实现方式: setert注入:通过setter方法进行注入依赖:参考代码HelloTest2 ...

  9. 监听css3的animation动画和transition事件

    webkit-animation动画有三个事件: 开始事件: webkitAnimationStart 结束事件: webkitAnimationEnd 重复运动事件: webkitAnimation ...

  10. 微信小程序,动态改变样式

    小程序目前没有修改样式api,但是可以利用数据绑定实现动态改变样式,可以用view标签模拟page然后改变view标签的样式,以下案例演示了如果改变page背景颜色: <view class=& ...