copy

 

copy語法的目的是改變副本的時候,不會影響到源對象。app

 

1、一個對象使用copy或mutableCopy方法能夠建立對象的副本。性能

2、copy - 須要先實現NSCoppying協議,建立的是不可變副本(如NSString、NSArray、NSDictonnary)spa

      實現NSCoppying協議,須要實現如下方法指針

      - (id)copyWithZone:(NSZone *)zone {orm

             Student *copy = [[Student allocWithZone:zone] init];    對象

              //拷貝名字給副本對象。繼承

              copy.name = self.name;字符串

              return copy;string

         }it

 

3、mutableCopy - 須要先實現NSMutableCopying協議,建立的事可變副本(如NSMUtableString、NSMutableArray、NSMutableDictionary)

4、深複製:內容拷貝,源對象和副本指向的是不一樣的兩個對象。源對象引用計數器不變,副本計數器設置爲1.

      淺複製:指針拷貝,源對象和副本指向的是同一個對象,對象的引用計數器+1,其實至關於作了一次retain操做。

5、只有不可變對象建立不可變副本(copy)纔是淺複製,其餘都是深複製。

 

 

 

6、#pragma mark 演示字符串的拷貝(深拷貝)。

 

 

 

void stringMutableCopy() {

 

    NSString *string = [[NSString alloc] initWithFormat:@"age is %i",10];    

 

    //產生了一個新對象,計數器爲1.

 

    NSMutableString *str = [string mutableCopy];

 

    NSLog(@"str:%zi", [str retainCount]);

 

    NSLog(@"string:%zi", [string retainCount]);    

 

    //調用mutableCopy產生的是可變副本,str和string不是相同對象。

 

    NSLog(@"%i",str == string);    

 

    //副本改變了,源對象不變。

 

    [str appendString:@"abcd"];

 

    NSLog(@"string:%@",string);

 

    NSLog(@"str:%@",str);    

 

    [str release];   

 

    [string release];

 

}

 

 

 

7、#pragma mark 演示字符串的拷貝(淺拷貝)。

 

 

 

void stringCopy1() {    

 

    NSString *string = [[NSString alloc] initWithFormat:@"age is %i",10];    

 

    //調用copy產生的是不可變副本,因爲源對象自己就不可變,全部爲了性能着想,copy會直接返回源對象自己,源對象計數器+1,str1和string是相同對象,    

 

    NSMutableString *str = [string copy];    

 

    NSLog(@"%@",string);

 

    NSLog(@"%i", str == string);    

 

    [str release];

 

    [string release];

 

}

 

 

 

8、#pragma mark 可變字符串的copy(深拷貝)

 

 

 

void mutableStringCopy() {

 

    NSMutableString *string = [NSMutableString stringWithFormat:@"age is %i ",10];    

 

    NSString *str = [string copy];

 

    NSLog(@"%i",str == string);    

 

    [str release];

 

    [string release];

 

}

 

  

 

9、#pragma mark 演示Student的name的copy

 

 

 

void studentNameCopy() {

 

    Student *stu = [Student studentWithName:@"abc"];

 

    NSMutableString *string = [NSMutableString stringWithFormat:@"age is %i", 10];

 

    stu.name = string; 

 

    [string appendString:@"123"];

 

    NSLog(@"name = %@", stu.name);

 

    NSLog(@"string = %@", string);

 

}

 

 

 

10、#pragma mark 演示Student的copy

 

 

 

void studentCopy() {

 

    Student *stu = [Student studentWithName:@"stu"];

 

    Student *stu1 = [stu copy];

 

    NSLog(@"%@",stu1);

 

}

 

 

11、#pragma mark 演示繼承的copy,GoodStudent類繼承Student,Student有成員變量name,GoodStudent有成員變量age.

 

void goodStudentCopy() {

 

    GoodStudent *stu = [GoodStudent goodStudentWithAge:10 andName:@"good"];

 

    NSLog(@"%@",stu);

 

    

 

    GoodStudent *stu1 = [stu copy];

 

    stu1.name = @"good1";

 

    stu1.age = 11;

 

    

 

    NSLog(@"%zi",stu.retainCount);

 

    NSLog(@"%zi", stu1.retainCount);

 

    NSLog(@"%@",stu1);

 

    

 

    [stu1 release];

 

}

相關文章
相關標籤/搜索