@@ -14,20 +14,23 @@ #import #import #import #import "OFObject.h" +#import "OFAutoreleasePool.h" #import "OFExceptions.h" #import "OFMacros.h" @implementation OFObject - init { if ((self = [super init]) != nil) { __memchunks = NULL; __memchunks_size = 0; + __retain_count = 1; } + return self; } - free { @@ -39,19 +42,41 @@ if (__memchunks != NULL) free(__memchunks); return [super free]; } + +- retain +{ + __retain_count++; + + return self; +} + +- release +{ + if (!--__retain_count) + return [self free]; + + return self; +} + +- autorelease +{ + [OFAutoreleasePool addToPool: self]; + + return self; +} - addToMemoryPool: (void*)ptr { void **memchunks; size_t memchunks_size; memchunks_size = __memchunks_size + 1; - if (SIZE_MAX - __memchunks_size == 0 || + if (SIZE_MAX - __memchunks_size < 1 || memchunks_size > SIZE_MAX / sizeof(void*)) @throw [OFOutOfRangeException newWithClass: [self class]]; if ((memchunks = realloc(__memchunks, memchunks_size * sizeof(void*))) == NULL) @@ -60,11 +85,11 @@ __memchunks = memchunks; __memchunks[__memchunks_size] = ptr; __memchunks_size = memchunks_size; - return ptr; + return self; } - (void*)getMemWithSize: (size_t)size { void *ptr, **memchunks;