NSCopying & NSCoding Example Code

3576 단어 Classinterface
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;
}

좋은 웹페이지 즐겨찾기