• Object-c学习之路十二(OC的copy)



    oc中的拷贝分为:copy(浅拷贝)和mutablecopy(深拷贝)。

    浅拷贝也为指针拷贝,拷贝后原来的对象计数器会+1;

    深拷贝为对象拷贝,原来的对象计数器不变。

    注意:自定义对象拷贝时要实现NSCoping协议或NSMutableCopying协议.且构造方法和copyWithZone方法中最好用[self class]来代替类名


    下面以NSString的拷贝 和Student,DoodStudent的copy(实现NSCoping协议)为例展示:

    OC学习基本快告一段落了,终于可以见到IOS界面了呵呵呵呵。。。。。闲话少说直接上代码:


    主函数:

    //
    //  main.m
    //  Copy
    //
    //  Created by WildCat on 13-7-27.
    //  Copyright (c) 2013年 wildcat. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import "Student.h"
    #import "GoodStudent.h"
    #pragma  mark 练习mutablecopy语法(深拷贝)对象拷贝。
    void mutablecopyTest(){
    
        NSString *string =[[NSString alloc] initWithFormat:@"Age is %i",10];
        //调用MutableCopy方法,产生一个可变的对象,MutableCopy后的对象和原来的对象不是同一个对象 ,原来的对象和新建的对象的计数器都是1
        NSMutableString *str=[string mutableCopy];
        [str appendString:@" no is 123"];
        NSLog(@"String's:%@ :count is %zi,
     str's: %@: count is %zi",string,[string retainCount],str,[str retainCount]);
        [str release];
        
        
        [string release];
    
    }
    #pragma  mark copy的练习  copy是浅拷贝(指针拷贝),对象只是做了retain操作
    void copyTest(){
        NSString *string =[[NSString alloc] initWithFormat:@"Age is %i",10];
        //调用Copy方法,产生一个可变的对象,copy后的对象和原来的对象是同一个对象 ,对象的计数器都是+1
        NSLog(@"Count:%zi",[string retainCount]);
        NSString *str=[string copy];
        NSLog(@"Count:%zi",[string retainCount]);
        
        NSLog(@"%i",str==string);
    
        [str release];
        [string release];
        
    
    
    }
    void studentNameCopy(){
    
        Student *stu=[[[Student alloc] init] autorelease];
        NSMutableString *str=[NSMutableString stringWithFormat:@"Jack"];
        stu.name=str;
        NSLog(@"name is :%@",stu.name);
        [str appendString:@" 你好。"];
        NSLog(@"name is :%@",stu.name);  //因为是用的copy方法 ,所以内容不变。如果用retain name会变
        NSLog(@"str is:%@",str);
    
    
    }
    void copyStudent(){
    
        Student *stu1=[Student studentWithName:@"lixingle"];
        Student *stu2=[stu1 copy];
        NSLog(@"Name1 is :%@",stu1.name);
        NSLog(@"Name2 is :%@",stu2.name);
        stu1.name=@"lele";
        NSLog(@"Name1 is :::%@",stu1.name);
        NSLog(@"Name2 is :::%@",stu2.name);
        [stu2 release];
        
    
    }
    #pragma mark GOOdStudent 的copy练习
    void goodStudentCopy(){
        GoodStudent *good1=[GoodStudent goodStudentWithAge:10 Name:@"乐乐"];
        GoodStudent *good2=[good1 copy];
        
        //改变good1,good2不会变
        good1.name=@"长超";
        NSLog(@"good1: %@",good1);
        NSLog(@"good2: %@",good2);
        [good2 release];
    
    
    }
    
    
    int main(int argc, const char * argv[])
    {
    
        @autoreleasepool {
            
            //copyTest();
            //studentNameCopy();
            //copyStudent();
            goodStudentCopy();
            
        }
        return 0;
    }
    



    Student类(例子中父类)

    #import <Foundation/Foundation.h>
    //对象Copy需要实现NSCoping协议
    @interface Student : NSObject<NSCopying>
    //NSString 对象一般用copy,外边的内容改变里边的内容不变。retain:当外边的内容改变时里边的内容也会改变
    //其他对象建议用retain
    @property (nonatomic,copy) NSString *name;
    +(id)studentWithName:(NSString *) name;
    -(id)copyStudent;
    @end
    
    //
    //  Student.m
    //  Copy
    //
    //  Created by WildCat on 13-7-27.
    //  Copyright (c) 2013年 wildcat. All rights reserved.
    //
    
    #import "Student.h"
    
    @implementation Student
    @synthesize name=_name;
    +(id)studentWithName:(NSString *) name{
        //这里用[self class] ,方便子类调用
        Student *stu=[[[[self class] alloc] init] autorelease];
        stu.name=name;
        return stu;
    }
    
    #pragma mark 实现协议
    //实现协议,要实现copyWithZone 方法
    -(id)copyWithZone:(NSZone *)zone{
        //这里创建的对象不需要释放,在外边释放   ;这里用[self class] ,方便子类调用
        Student *stu=[[[self class] allocWithZone:zone] init];
        stu.name=self.name;
        return stu;
    }
    - (void)dealloc
    {
        [_name release];
        [super dealloc];
    }
    //重写description方法
    -(NSString *)description{
        return [NSString stringWithFormat:@"name is %@",self.name];
    
    }
    @end
    



    GoodStudent类(子类)

    #import "Student.h"
    
    @interface GoodStudent : Student
    @property (nonatomic,assign)int age;
    +(id) goodStudentWithAge:(int) age Name:(NSString *)name;
    @end
    #import "GoodStudent.h"
    
    @implementation GoodStudent
    +(id) goodStudentWithAge:(int) age Name:(NSString *)name{
        GoodStudent *good=[GoodStudent studentWithName:name];
        good.age=age;
        return good;
    
    }
    -(id)copyWithZone:(NSZone *)zone{
        GoodStudent *copy=[super copyWithZone:zone];
        copy.age=self.age;
        return copy;
        
    
    }
    -(NSString *)description{
    
        return [NSString stringWithFormat:@"name is :%@,age is:%i,",self.name,self.age];
    
    }
    
    @end
    



  • 相关阅读:
    我的第一个网络爬虫
    python中os模块的walk函数
    <Think Python>中统计文献单词的处理代码
    <Think Python>中斐波那契使用memo实现的章节
    Python中bisect的使用
    vim中使用系统粘贴板
    linux下的重命名
    HTML Dog 初级教程中关于 forms 的翻译
    unittest:1 用例编写
    python UI自动化实战记录十一: 总结
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3221685.html
Copyright © 2020-2023  润新知