黑马程序员——OC学习总结--copy用法

------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

转载于:https://www.cnblogs.com/qiang0901/p/4469734.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值