This is NSObject.m in view mode; [Download] [Up]
/* Interface for NSObject class
*
* Copyright (C) 1994 The Board of Trustees of
* The Leland Stanford Junior University. All Rights Reserved.
*
* Author: Paul F. Kunz
*
* This file is part of an Objective-C class library
*
* Based on:
* (Preliminary Documentation) Copyright (c) 1994 by NeXT Computer, Inc.
* All Rights Reserved.
*
* Original source copied from GNU implementation of Object
*
* NSObject.m,v 1.4 1995/03/28 23:56:11 fedor Exp
*/
#include "NSObject.h"
#include <objc/Protocol.h>
#ifdef __NeXT__
#include <objc/objc-class.h>
#endif
#include "NSString.h"
#include "zone.h"
#include <stdarg.h>
#include <stdio.h>
/* use the NeXT run-time if compiling on a NeXT with NeXT's cc */
#ifdef __NeXT__
#define class_get_class_method class_getClassMethod
#define class_get_instance_method class_getInstanceMethod
#define class_get_version class_getVersion
#define class_pose_as class_poseAs
#define class_set_version class_setVersion
#define object_get_class_name object_getClassName
#define sel_get_name sel_getName
static inline Class
class_get_super_class(Class class)
{
return CLS_GETINFO(class, CLS_CLASS)?class->super_class:Nil;
}
typedef struct objc_method *Method_t;
#define METHOD_NULL (Method_t)0
static inline IMP
method_get_imp(Method_t method)
{
return (method!=METHOD_NULL)?method->method_imp:(IMP)0;
}
static inline Class
object_get_class(id object)
{
return ((object!=nil)
? (CLS_GETINFO(object->isa, CLS_CLASS)
? object->isa
: (CLS_GETINFO(object->isa, CLS_META)
? (Class)object
: Nil))
: Nil);
}
static inline Class
object_get_super_class
(id object)
{
return ((object!=nil)? (CLS_GETINFO(object->isa, CLS_CLASS)
? object->isa->super_class
: (CLS_GETINFO(object->isa, CLS_META)
? ((Class)object)->super_class
: Nil))
: Nil);
}
static inline BOOL
object_is_instance(id object)
{
return (object!=nil)&&CLS_GETINFO(object->isa, CLS_CLASS);
}
#endif /* __NeXT__ */
extern void (*_objc_error)(id object, const char *format, va_list);
extern int errno;
@implementation NSObject
+ (void)initialize
{
return;
}
+ (id)alloc
{
#ifdef __NeXT__
return class_createInstance( self, 0 );
#else
return class_create_instance( self );
#endif
}
+ (id)allocWithZone:(NSZone *)zone
{
#ifdef __NeXT__
return class_createInstanceFromZone( self, 0, (NSZone *)zone );
#else
return [self alloc]; /* fake it */
#endif
}
+ (id)new
{
return [[self alloc] init];
}
- (id)copy
{
#ifdef __NeXT__
return object_copy( (Object *)self, 0); /* even thou it's an NSObject */
#else
return object_copy(self);
#endif
}
- (void)dealloc
{
object_dispose( (id)self);
return;
}
- (id)init
{
return self;
}
- (id)mutableCopy
{
return [self copy]; /* to be fixed when mutable is understood */
}
+ (Class)class
{
return self;
}
+ (Class)superclass;
{
return object_get_super_class(self);
}
- (NSZone *)zone
{
return (NSZone *)0;
}
+ (BOOL)instancesRespondToSelector:(SEL)aSelector;
{
return class_get_instance_method(self, aSelector)!=METHOD_NULL;
}
+ (BOOL)conformsToProtocol:(Protocol *)aProtocol;
{
int i;
struct objc_protocol_list* proto_list;
for (proto_list = isa->protocols;
proto_list; proto_list = proto_list->next)
{
for (i=0; i < proto_list->count; i++)
{
if ([proto_list->list[i] conformsTo: aProtocol])
return YES;
}
}
if ([self superclass])
return [[self superclass] conformsTo: aProtocol];
else
return NO;
}
+ (IMP)instanceMethodForSelector:(SEL)aSelector;
{
return method_get_imp(class_get_instance_method(self, aSelector));
}
- (IMP)methodForSelector:(SEL)aSelector;
{
return (method_get_imp(object_is_instance(self)
?class_get_instance_method(self->isa, aSelector)
:class_get_class_method(self->isa, aSelector)));
}
// - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector;
/*
* Returns an object that contains a description of the aSelector method, or
* nil if the aSelector method can't be found.
*/
+ (NSString *)description
{
return [NSString stringWithCString:object_get_class_name(self)];
}
+ (void)poseAsClass:(Class)aClass
{
class_pose_as(self,aClass);
return;
}
- _error:(const char *)aString, ...
{
#define FMT "error: %s (%s)\n%s\n"
char fmt[(strlen((char*)FMT)+strlen((char*)object_get_class_name(self))
+((aString!=NULL)?strlen((char*)aString):0)+8)];
va_list ap;
sprintf(fmt, FMT, object_get_class_name(self),
object_is_instance(self)?"instance":"class",
(aString!=NULL)?aString:"");
va_start(ap, aString);
// (*_objc_error)(self, fmt, ap);
vfprintf (stderr, fmt, ap);
va_end(ap);
return nil;
#undef FMT
}
- (void)doesNotRecognizeSelector:(SEL)aSelector;
{
[self _error:"%s does not recognize %s",
object_get_class_name(self), sel_get_name(aSelector)];
return;
}
// + (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget
// selector:(SEL)aSelector
// object:(id)anObject;
/*
* Cancels previous perform requests having the same target and argument (as
* determined by isEqual:), and the same selector. This method removes
* timers only in the current run loop, not all run loops.
*/
// - (void)performSelector:(SEL)aSelector
// object:(id)anObject
// afterDelay:(NSTimeInterval)delay
/*
* Sends an aSelector message to anObject after delay. self and anObject
* are retained until after the action is executed.
*/
// - (void)forwardInvocation:(NSInvocation *)anInvocation
/*
* Implemented by subclasses to forward messages to other objects.
*/
- (id)awakeAfterUsingCoder:(NSCoder *)aDecoder;
{
// [super awakeAfterUsingCoder:aDecoder];
return self;
}
- (Class)classForArchiver
{
return [self classForCoder];
}
- (Class)classForCoder
{
return [self class];
}
- (id)replacementObjectForArchiver:(NSArchiver *)anArchiver
{
return [self replacementObjectForCoder:(NSCoder *)anArchiver];
}
- (id)replacementObjectForCoder:(NSCoder *)anEncoder;
{
return self;
}
+ (void)setVersion:(int)version;
{
class_set_version(self, version);
return;
}
+ (int)version;
{
return class_get_version(self);
}
// @end
// @protocol NSObject
// NSObject protocol
- (unsigned)hash;
/*
* Returns an unsigned integer that can be used as a table address in a hash
* table structure. Two objects that are equal must hash to the same value.
*/
{
return (size_t)self; /* Is this right? */
}
- (BOOL)isEqual:(id)anObject;
/*
* Returns YES if the receiver and anObject have equal values; otherwise
* returns NO.
*/
{
return self==anObject; /* taken from GNU Object.m. Is it right? */
}
- (id)self;
{
return self;
}
- (Class)class;
{
return object_get_class(self);
}
- (Class) superclass;
{
return object_get_super_class(self);
}
- (id)perform:(SEL)aSelector
{
IMP msg = [self methodForSelector:aSelector];
if (!msg)
return [self _error:"invalid selector passed to %s", sel_get_name(_cmd)];
return (*msg)(self, aSelector);
}
- (id)perform:(SEL)aSelector
withObject:(id)anObject;
{
IMP msg = [self methodForSelector:aSelector];
if (!msg)
return [self _error:"invalid selector passed to %s", sel_get_name(_cmd)];
return (*msg)(self, aSelector, anObject);
}
- (id)perform:(SEL)aSelector
withObject:(id)anObject
withObject:(id)anotherObject;
{
IMP msg = [self methodForSelector:aSelector];
if (!msg)
return [self _error:"invalid selector passed to %s", sel_get_name(_cmd)];
return (*msg)(self, aSelector, anObject, anotherObject);
}
// Identifying Proxies
- (BOOL)isProxy
{
return NO;
}
- (BOOL)isKindOfClass:(Class)aClass
{
Class class;
for (class = self->isa; class!=Nil; class = class_get_super_class(class))
if (class==aClass)
return YES;
return NO;
}
- (BOOL)isMemberOfClass:(Class)aClass
{
return self->isa==aClass;
}
- (BOOL) conformsToProtocol: (Protocol *)aProtocol
{
int i;
struct objc_protocol_list* proto_list;
for (proto_list = isa->protocols;
proto_list; proto_list = proto_list->next)
{
for (i=0; i < proto_list->count; i++)
{
if ([proto_list->list[i] conformsTo: aProtocol])
return YES;
}
}
if ([self superclass])
return [[self superclass] conformsToProtocol: aProtocol];
else
return NO;
}
- (BOOL)respondsToSelector:(SEL)aSelector;
{
return ((object_is_instance(self)
?class_get_instance_method(self->isa, aSelector)
:class_get_class_method(self->isa, aSelector))!=METHOD_NULL);
}
// - (id)autorelease
/*
* As defined in the NSObject class, decrements the receiver's reference
* count. When the count reaches 0, adds the object to the current
* autorelease pool. Returns self. Objects in the pool are released later,
* typically at the top of the event loop.
*/
// - (oneway void)release;
/*
* As defined in the NSObject class, decrements the receiver's reference
* count. When the count reaches 0, the object is automatically deallocated
* immediately.
*/
// - (id)retain;
/*
* As defined in the NSObject class, retain increments the receiver's
* reference count. You send an object a retain message when you want to
* prevent it from being deallocated without your express permission.
* Returns self.
*/
// - (unsigned)retainCount
/*
* Returns the receiver's reference count for debugging purposes.
*/
- (NSString *)description;
{
return [NSString stringWithCString:object_get_class_name(self)];
}
// NSCoding
// Serializing and Deserializing Objects
// @protocol NSCoding
- (void)encodeWithCoder:(NSCoder *)aCoder
{
return;
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.