标签:
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
copy的使用
copy 和 mutableCopy
当一个对象 使用 copy 和 mutableCopy 方法可以创建对象的副本
copy 需实现NSCopying协议 创建不可变副本
mutableCopy 需实现NSMutableCopying协议 创建不可变副本
深拷贝: 内容拷贝 源对象和副本指向不同的两个对象,源对象引用计数器不变,副本计数器设置为1
浅拷贝 :指针拷贝 源对象和副本对象指向的是同一个对象,对象的医用计数器 加+ 等于retainle 了一次
例:
#import <Founation/Founation.h>
void main{
@autoreleasepool
{
NSString *string=[stringWithString:@"hello"];
NSString *s=[string copy];
NSLog(@"%i",string==s);//copy返回的是 对象本身 源计数器加1
NSMutable *str1 =[string NSMutableCopy]// 不可变string 调用了NSMutableCopy 就会返回一个可变对象 新对象计数器加1
NSMutable *str2=[strngWithFormat:@" his age is %i",10];
NSMutable *s2=[str2 NSMutableCopy]//返回了一个新对象 计数器加1
[s2 appendString:@"alone"];
NSLog(@"%@",str2);
NSLog(@"%@",s2);
//拷贝出来对象改变不影响源对象
[s release];
[s2 release];
}
}
@property(copy) 中的copy策略
使用copy策略 对象会release 一个旧对象 copy一个新对象
外部的 变量的改变 则不影响内部的成员变量
例:
@interface Student:NSObject
@property(nonatomic,copy) NSString * str;
@end
void main{
Student *stu=[[[Student alloc] init] autoreleasepool];
NSMutable *s=[stringWithString:"yi qie"];
stu.string=s;
[s appendString:@"dou hao"];
NSLog(@"%@",stu.string);
NSLog(@"%@",s);
}
运行结果:
使用retain策略:
yi qie dou hao
yi qie dou hao
使用copy策略:
yi qie //源对象变量不变
yi qie dou hao
// NSString 一般使用copy策略
//其他的类一般使用 retain策略
一般类使用 copy
使用前必须实现NSCoping 协议
@interface Teacher : NSObject<NSCopping>
@property int age;
+(id)teacher;
@end
#import "teacher.h"
@implementation Teacher
+(id)teacher{
Teacher *tea=[[[Teacher alloc] init] autorelease];
return tea;
-(id)copyWithZone(NSZone *)zone{
Teacher *tea=[[[[self class] alloc] init] autorelease];
tea.age=self.age;
return self;
}
}
@end
#import <Founation/Founation.h>
#import "Teacher.h"
void main(){
Teacher *teacher=[Teacher teacher];
Teacher tea=[teacher copy]; //copy一个新的Teacher对象且两个对象互不影响
teacher.age=10;
tea.age=12;
NSLog(@"teacher age is %i",teahcer.age);
NSLog(@"tea age is %i",teahcer.age);
}
运行结果;
teaher age is 10
tea age is 12
黑马程序员——OC学习总结--copy用法
标签:
原文地址:http://www.cnblogs.com/qiang0901/p/4469734.html