NSCopying & NSCoding Example Code

Fraction


#import <Foundation/Foundation.h>
@class Foo;
@interface Fraction:NSObject<NSCoding, NSCopying>{
	int numerator;//分子
	@public int denominator;//分母
	Foo *foo;
}

-(void)setNumerator:(int)aNumerator;
-(void)setDenominator:(int)aDenominator;

-(int)numerator;
-(int)denominator;

-(void)setFoo:(Foo *)aFoo;
-(Foo *)foo;

@end;

#import <Foundation/Foundation.h>
#import "Fraction.h"
#import "Foo.h"

@implementation Fraction

-(void)dealloc{
	NSLog(@"foo retainCount1 : %d", [foo retainCount]);
	[foo release];

	[super dealloc];

}

-(void)setNumerator:(int)aNumerator{
	self->numerator = aNumerator;
}

-(void)setDenominator:(int)aDenominator{
	self->denominator = aDenominator;
}


-(int)numerator{
	return self->numerator;
}
-(int)denominator{
	return self->denominator;
}

-(void)setFoo:(Foo *)aFoo{
	[aFoo retain];
	[foo release];
	foo = aFoo;
	
}
-(Foo *)foo{
	
	return foo;
}


//implementation NSCoding protocol
- (void) encodeWithCoder: (NSCoder*)aCoder{
	[aCoder encodeInt:numerator forKey:@"numerator"];
	[aCoder encodeInt:denominator forKey:@"denominator"];
	[aCoder encodeObject:foo forKey:@"foo"];
}

- (id) initWithCoder: (NSCoder*)aDecoder{
	self = [super init];
	if (self){
		numerator = [aDecoder decodeIntForKey:@"numerator"];
		[self setNumerator:numerator];

		denominator = 	[aDecoder decodeIntForKey:@"denominator"];
		[self setDenominator:denominator];

		[self setFoo:(Foo *)[aDecoder decodeObjectForKey:@"foo"]];
	}
	return self;
}	

//implementation NSCopying protocol
//copyWithZone:(NSZone *)zone,mutableCopyWithZone: (NSZone*)zone 这两个方法生成的对象都是autorelease的
- (id) copyWithZone: (NSZone*)zone{
	//return self;//浅拷贝
	Fraction *aFraction = [[[self class] allocWithZone:zone] init];  
	[aFraction setNumerator:numerator];
	[aFraction setDenominator:denominator];
	[aFraction setFoo:foo];
	return aFraction; 
}


+ (void) load{
	NSLog(@"Auto called the load function.");
}

@end

main


#import <Foundation/Foundation.h>
#import "Fraction.h"
#import "Foo.h"


int main (int argc, const char *argv[]) {
	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

	Foo *foo = [[Foo alloc] init];
	
	Fraction *f = [[Fraction alloc] init];
	[f setNumerator:10];
	[f setDenominator:20];
	[f setFoo:foo];
	[foo release];

	NSLog(@"numerator : %d", [f numerator]);
	NSLog(@"denominator : %d", [f denominator]);
	NSLog(@"foo : %@", [f foo]);

	NSData *data = [NSKeyedArchiver archivedDataWithRootObject:f];
	[data writeToFile:@"fraction.db" atomically:NO];
	
	[f release];
	


	/*如果没有实现NSCoding,在序列化的时候不会报错,但是取出的时候结果为空
	 */
	
	Fraction *f1 = [NSKeyedUnarchiver unarchiveObjectWithFile:@"fraction.db"];
	NSLog(@"numerator1 : %d", [f1 numerator]);
	NSLog(@"denominator1 : %d", [f1 denominator]);
	NSLog(@"foo1 : %@", [f1 foo]);
	NSLog(@"retainCount1 : %d", [f1 retainCount]);
	
	
	/*
	 *如果没有实现NSCopying,在执行copy方法的时候会直接报错,但是在编译的时候不会出错.
	 *如果是浅拷贝需要在执行copy前,给被copy的对像retain,否则有些obj会造成多次释放
	 *如果是深拷贝则不需要
	 *copyWithZone:(NSZone *)zone,mutableCopyWithZone: (NSZone*)zone 这两个方法生成的对象都是autorelease的
	 */
	
	Fraction *f2 = [f1 copy];
	NSLog(@"numerator2 : %d", [f2 numerator]);
	NSLog(@"denominator2 : %d", [f2 denominator]);
	NSLog(@"foo2 : %@", [f2 foo]);;
	NSLog(@"retainCount2 : %d", [f2 retainCount]);
	[f2 release];
	
	[pool drain];
	return 0;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为Teacher类实现NSCopying协议,并实现Teacher对象的深复制的步骤如下: 1. 让Teacher类继承NSCopying协议。 2. 在Teacher类的代码实现部分重写继承自NSCopying协议的CopyWithZone:方法,该方法返回一个该类的不可变对象副本。 具体实现代码如下: ```objective-c @interface Teacher : NSObject <NSCopying> @property (nonatomic, copy) NSString *name; @property (nonatomic, assign) NSInteger age; @end @implementation Teacher - (id)copyWithZone:(NSZone *)zone { Teacher *teacher = [[Teacher allocWithZone:zone] init]; teacher.name = [self.name copy]; teacher.age = self.age; return teacher; } @end ``` 在上述代码中,我们重写了NSCopying协议的copyWithZone:方法,该方法返回了一个Teacher类的不可变对象副本。在该方法中,我们使用allocWithZone:方法来创建一个新的Teacher对象,然后将原对象的属性值赋值给新对象的属性,最后返回新对象。 接下来,我们可以创建一个Teacher对象,并对其进行深复制,然后输出原对象和副本的地址和内容,具体代码如下: ```objective-c Teacher *teacher = [[Teacher alloc] init]; teacher.name = @"Tom"; teacher.age = 30; Teacher *copyTeacher = [teacher copy]; NSLog(@"teacher address: %p, name: %@, age: %ld", teacher, teacher.name, teacher.age); NSLog(@"copyTeacher address: %p, name: %@, age: %ld", copyTeacher, copyTeacher.name, copyTeacher.age); ``` 在上述代码中,我们首先创建了一个Teacher对象,并设置了其属性值。然后,我们对该对象进行深复制,并将副本赋值给copyTeacher变量。最后,我们使用NSLog输出了原对象和副本的地址和内容。 运行上述代码,可以得到如下输出结果: ``` teacher address: 0x7f8d5a402b20, name: Tom, age: 30 copyTeacher address: 0x7f8d5a402b40, name: Tom, age: 30 ``` 可以看到,原对象和副本的地址不同,且它们的属性值相同,说明我们成功地实现了Teacher对象的深复制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值