你的位置:首页 > 操作系统

[操作系统]NSCopyNSMutableCopy


struct student

{

    int a;

    float f;

    char c;

    long l;

};

 

struct person

{

    int a;

    float f;

    char c;

    long l;

};

 

void test1(void)

{

    int a=12;

    int b;

    memcpy(&b, &a , sizeof(a));

    NSLog(@"b=%i",b);

 

    struct student stu1={1,1.5,'x',88888888};

    struct student stu2;

    memcpy(&stu2, &stu1, sizeof(stu1));

    NSLog(@"%i, %f,%c, %ld",stu2.a,stu2.f,stu2.c,stu2.l);

     

//    struct person per=stu1;

    struct person per;

    

    memcpy(&per, &stu1, sizeof(stu1));

    NSLog(@"per: %i,%f,%c,%ld",per.a,per.f,per.c,per.l);

}

 

void testStringCopy(void)

{

    NSString* s1=[[NSString alloc]initWithFormat:@"name:%s","wenhua" ];

    

    NSString* s2 = [s1 copy]; //浅拷贝

    

    NSLog(@"s1:%p, %@",s1,s1);

    NSLog(@"s2:%p, %@",s2,s2);

    

    

    NSMutableString* s3 = [s1 copy];

    NSLog(@"s3:%p,%@",s3,s3);

 

    //  不可变字符串的copy方法: 1,浅拷贝,2,还是不可变

    

 

    NSString* s4 = [s1 mutableCopy]; //深拷贝

    NSLog(@"s4:%p,%@",s4,s4);

    

    

    [(__bridge id)(__bridge void *)s4 appendString:@"append"];

    

     NSLog(@"s4:%p,%@",s4,s4);

     NSLog(@"s1:%p, %@",s1,s1);

    

    // 不可变字符串的mutableCopy方法: 1,深拷贝,2,拷贝出来的是可变的

    

 

    NSMutableString* s5=[[NSMutableString alloc]initWithString:@"string"];

    

    NSMutableString* s6 = [s5 copy];  //深拷贝,但s6不可变

    NSLog(@"s5: %p,%@",s5,s5);

    NSLog(@"s6: %p,%@",s6,s6);

//    [s6 appendString:@"appendStringFors6"];

    

    // 可变字符串的copy方法: 1,深拷贝,2,,拷贝出来的是不可变的

    

 

    NSMutableString* s7 = [s5 mutableCopy];//深拷贝,s7是可变的

    NSLog(@"s7: %p,%@",s7,s7);

    

    [s7 appendString:@"appendStringFors7"];

     NSLog(@"s7: %p,%@",s7,s7);

 

    // 可变字符串的mutableCopy方法: 1,深拷贝, 2,拷贝出来的是可变的

    

    

    /*

            总结:

                                                 拷贝             可变拷贝

                                                 copy           mutableCopy

            不可变字符串NSString调:  浅,不可变    深,可变

            可变NSMutableString调:  深,不可变    深,可变

    你想啊,mutableCopy后,为了两个对象修改后互不影响,一定是深拷贝啦,不会只是拷贝指针;可变字符串copy后,自然是深拷贝,因为一个可变一个不可变;不可变字符串copy,只需要浅拷贝就行喽!

     */

}

 

void testArrayCopy(void)

{   

    /*

         不可变数组和可变数组的拷贝情况:

        不可变字典和可变字典的拷贝情况:

     */

  

    NSString* s1=@"abcd";

//    NSArray* a1=@[@"1",@"2"];

    NSMutableArray* a1 = [[ NSMutableArray alloc]initWithArray:@[@"1",@"2"]];

 

    Person* person = [[ Person alloc]init];

    NSLog(@"person计数:%lu",[person retainCount]);

    [a1 addObject:person];

    NSLog(@"person计数:%lu",[person retainCount]);

 

    

    NSArray* array1 = [[NSArray alloc]initWithObjects:s1,a1, nil];

 

    NSArray* array2  =[array1 copy];

    

    NSLog(@"array1:%p,%@",array1,array1);

    NSLog(@"array2:%p,%@",array2,array2);

 

    

    NSMutableArray *array3 = [array1 copy];

    NSLog(@"array3:%p,%@",array3,array3);

    

    NSMutableArray * array4 = [array1 mutableCopy]; //可变

    NSLog(@"array4:%p,%@",array4,array4);

 

    NSLog(@"array1:[0]:%p,[1]:%p",array1[0],array1[1]);

    NSLog(@"array4:[0]:%p,[1]:%p",array4[0],array4[1]);

    [array4 addObject:@"add"];

    NSLog(@"array4 count is %lu",[array4 count]);//array4是可变数组

 

    [array1 release];

    [array2 release];

    [array3 release];

    [array4 release];

    [person release];

    [a1 release];

}

 

void test3(void)

{

    Person *person =[[Person alloc]init];

    NSLog(@"person的计数:%lu",[person retainCount]);

    NSMutableArray *array = [[ NSMutableArray alloc]init];

    [array addObject:person];

    NSLog(@"person的计数:%lu",[person retainCount]);

    NSMutableArray *newArray = [array mutableCopy];//拷贝了一层

    NSLog(@"person的计数:%lu",[person retainCount]);

    

    [array release];

    [newArray release];

    [person release];

    

}

 

 

void test4(void)

{

    Person* person = [[ Person alloc]init];

    NSLog(@"person的计数:%lu",[person retainCount]);

    NSMutableArray *array = [[ NSMutableArray alloc]init];

    [array addObject:person];

    NSLog(@"person的计数:%lu",[person retainCount]);

    

    //对可变数组调copy方法,

    NSMutableArray *newArray = [array copy];

    // ? 拷贝出来的数组可不可变?  拷了几层?

//    [newArray addObject:@"add"]; //回答:拷贝出来的数组不可变

    

    

    NSLog(@"person的计数:%lu",[person retainCount]);

    

    [array release];

    [newArray release];

    [person release];

 

}

 

void test2(void)

{

    Person* person = [[ Person alloc]init];

    

    //问:为什么NSString类的实例变量在property语法中要用copy?

    

    NSMutableString* name=[[NSMutableString alloc]initWithString:@"wenhua"];

    person.name=name;

    

    NSLog(@"person.name:%p,name:%p",person.name,name);

    

    [name appendFormat:@".奥斯特洛夫斯基"];

    NSLog(@"person.name: %@",person.name);

    

    //因为传入person对象的name是可变字符串对象,如果用retain来修饰,则会造成在外边就可以修改person对象的实例变量,不符合封装的思想,所以用copy

}

 

//拷贝自定义的对象

void copyForObject(void)

{

    /*

         理论:

                1, 对象如果要调copy方法,就要遵守NSCopy协议

                2, 对象如果要调mutableCopy方法,就要遵守NSMutableCopying协议

     

                但是注意: copy方法 不是协议NSCopying的方法

                         mutableCopy方法 也不是协议NSMutableCopying的方法

                        copy和mutableCopy都是NSObject实现的方法

     

                因为:  在NSObject实现的copy方法内部调用了协议NSCopying的方法

                      在NSObject实现的mutableCopy方法内部调用了协议NSMutableCopying的方法

     

                NSCopying规定的方法名: 

                        copyWithZone:

     

                NSMutableCopying规定的方法名:

           mutableCopyWithZone:

     */

    

/*

#import "Person.h"

@implementation Person

 

//协议NSCopying规定的一个方法,这个方法由copy方法内部来调

-(id)copyWithZone:(NSZone *)zone

{

    Person* person =    [[[self class] allocWithZone:zone ]init];

    person.name=self.name;

    return person;

}

 

-(id)mutableCopyWithZone:(NSZone *)zone

{

    Person* person = [[[self class] allocWithZone:zone ]init];

    person.name=self.name;

    return person;

}

@end

*/

    

    Person* p1 = [[ Person alloc]init];

    Person *p2 = [p1 copy];//p1可以调copy,是因为Person类实现了copyWithZone:方法

    

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

    

    Person* p3 = [ p1 mutableCopy];//p1可以调mutableCopy,是因为Person类实现了mutableCopyWithZone:方法

    NSLog(@"p3:%p",p3);

}