现在的位置: 首页 > 综合 > 正文

NSCopying & NSCoding Example Code

2013年11月11日 ⁄ 综合 ⁄ 共 2832字 ⁄ 字号 评论关闭

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;
}

抱歉!评论已关闭.