Quantcast
Viewing all articles
Browse latest Browse all 35570

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


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

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

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

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


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

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

Image may be NSFW.
Clik here to view.
Image may be NSFW.
Clik here to view.
Image may be NSFW.
Clik here to view.
Image may be NSFW.
Clik here to view.


主函数:

//
//  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,\n 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



作者:superlele123 发表于2013-7-27 14:20:51 原文链接
阅读:32 评论:0 查看评论

Viewing all articles
Browse latest Browse all 35570

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>