NSObject-拷贝 NSCopy-NSMutablecopy

来源:互联网 发布:源码分享是什么意思 编辑:程序博客网 时间:2024/04/30 10:48


NSCopy-NSMutablecopy


  •  浅拷贝:不产生新的对象,直接指向原有对象   浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间。
  • 深拷贝:产生新的对象(新地址),其内容是原有对象的内容
       
     NSCopy拷贝出的结果是不可变对象,跟其接受类型没有关系,跟其传入类型也没有关系,NSMutablecopy拷贝的结果是可变对象,跟其传入的类型没有关系,但是会受其接收类型的影响,

     当使用NSCopy复制一个不可变对象时,其行为是浅复制,其余情况都是深拷贝
      当使用NSMutablecopy时,是深拷贝

如下:

 拷贝行为属于拷贝出的结果NSCopy复制一个不可变对象浅复制不可变对象复制一个可变对象深拷贝NSMutablecopy深拷贝受接收类型影响


通过一个示例程序来补充下细节



main.m

#import<Foundation/Foundation.h>

#import"Person.h"


int main(int argc, constchar * argv[]) {
   

   @autoreleasepool {

        Person *p = [[Personalloc]init];       

       NSMutableString *s = [NSMutableStringstringWithFormat:@"汉三"];//对可变字符串进行操作,地址不会变化,改变的是内容。对不可变字符串的重新赋值,地址内容都会改变。

       

        p.name = s;//

       NSLog(@"%p,%p",p.name,s);//打印:0x100114990,0x100114a80

       Person *p1 = [pmutableCopy];//p属于Person类对象,[]内调用方法必须在该类中存在该方法的协议和实现    //此处使用:Person *p1 = [p mutableCopy];    示例

       NSLog(@"%@,%@",p1,p);

        [ssetString:@"王五"];

        p1.name = s;

       NSLog(@"%@,%@,%p,%p",p,p1,p1.name,s);//如果不用copy,对象属性的值会一直跟着变

       //打印0x100300160,0x100114a80

    }

   return0;

}


Person.h

//如果自定义类想要实现拷贝操作,首先需要遵循NSCopyingNSMutableCopying协议,

#import<Foundation/Foundation.h>

@interface Person :NSObject<NSCopying,NSMutableCopying>//协议不能少

@property (nonatomic,copy)NSString *name;//NSCopy拷贝出的结果是不可变对象

@end


Person.m

#import"Person.h"

@implementation Person
-(

-(NSString *)description{   

   return_name;
}

}

//如果直接return self,则是浅拷贝,如果使用alloc,则是深拷贝

-(id)copyWithZone:(NSZone *)zone{
   
    Person *p = [PersonallocWithZone:zone];

 // p.name = [self.name copy];

   return p;
}

}

//如果直接return self,则是浅拷贝,如果使用alloc,则是深拷贝

-(id)mutableCopyWithZone:(NSZone *)zone{
   

   Person *p = [PersonallocWithZone:zone];
   

   // p.name = [self.name copy];

   return p;
}

}


@end

       

0 0
原创粉丝点击