Skip to content

Instantly share code, notes, and snippets.

@fjolnir
Created July 2, 2012 07:37
Show Gist options
  • Save fjolnir/3031702 to your computer and use it in GitHub Desktop.
Save fjolnir/3031702 to your computer and use it in GitHub Desktop.
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
#import <objc/message.h>
@interface TQStackObject {
Class isa;
}
- (id)copy;
- (id)autoreleasedCopy;
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector;
- (void)doesNotRecognizeSelector:(SEL)aSelector;
- (Class)class;
- (id)self;
- (id)superclass;
- (BOOL)isEqual:(id)aCounterPart;
- (BOOL)isKindOfClass:(Class)aClass;
- (BOOL)isMemberOfClass:(Class)aClass;
- (BOOL)respondsToSelector:(SEL)aSel;
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;
- (id)performSelector:(SEL)aSelector;
- (id)performSelector:(SEL)aSelector withObject:(id)anObject;
- (id)performSelector:(SEL)aSelector withObject:(id)anObject withObject:(id)anotherObject;
- (BOOL)isProxy;
- (NSString *)description;
@end
@implementation TQStackObject
- (id)copy
{
[NSException raise:NSGenericException format:@"-copy not implemented for class %@", [self class]];
return nil;
}
- (id)autoreleasedCopy
{
return [[self copy] autorelease];
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
{
Method method = class_getInstanceMethod(self->isa, aSelector);
if(!method)
return nil;
return [NSMethodSignature signatureWithObjCTypes:method_getTypeEncoding(method)];
}
- (void)doesNotRecognizeSelector:(SEL)aSelector
{
[NSException raise:NSInvalidArgumentException
format:@"unrecognized selector '%@' sent to class %p",
NSStringFromSelector(aSelector), [self class]];
}
- (Class)class
{
return self->isa;
}
- (id)self
{
return self;
}
- (id)superclass
{
return class_getSuperclass([self class]);
}
- (BOOL)isEqual:(id)aCounterPart
{
return self == aCounterPart;
}
- (BOOL)isKindOfClass:(Class)aClass
{
}
- (BOOL)isMemberOfClass:(Class)aClass
{
}
- (BOOL)respondsToSelector:(SEL)aSel
{
return class_getInstanceMethod([self class], aSel) != nil;
}
- (BOOL)conformsToProtocol:(Protocol *)aProtocol
{
return class_conformsToProtocol([self class], aProtocol);
}
- (id)performSelector:(SEL)aSelector
{
return objc_msgSend(self, aSelector);
}
- (id)performSelector:(SEL)aSelector withObject:(id)anObject
{
return objc_msgSend(self, aSelector, anObject);
}
- (id)performSelector:(SEL)aSelector withObject:(id)anObject withObject:(id)anotherObject
{
return objc_msgSend(self, aSelector, anObject, anotherObject);
}
- (BOOL)isProxy
{
return NO;
}
- (NSString *)description
{
Class kls = [self class];
return [NSString stringWithFormat:@"<%s: %p>", class_getName(kls), kls];
}
// These are just here to catch errors
- (id)retain
{
return [self copy];
}
- (NSUInteger)retainCount
{
return UINT_MAX;
}
- (oneway void)release
{
[NSException raise:NSGenericException format:@"Releasing a stack object makes no sense"];
}
@end
@interface TQStackNumber : TQStackObject {
double _value;
}
- (double)value;
- (void)setValue:(double)aValue;
@end
@implementation TQStackNumber
- (id)autoreleasedCopy
{
// return [TQNumber numberWithDouble:_value];
}
- (id)copy
{
//return [[TQNumber numberWithDouble:_value] retain];
}
- (double)value
{
return _value;
}
- (void)setValue:(double)aValue
{
_value = aValue;
}
@end
int main(int argc, char *argv[]) {
NSAutoreleasePool *p = [[NSAutoreleasePool alloc] init];
struct { id isa; double value; } stackObj = { NSClassFromString(@"TQStackNumber"), 0.0 };
TQStackNumber *stackObjPtr = (TQStackNumber *)&stackObj;
[stackObjPtr setValue:3];
NSLog(@"%f %@", [stackObjPtr value], [stackObjPtr description]);
[p release];
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment