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