📄 object.m
字号:
/* This file contains the implementation of class Object. Copyright (C) 1992 Free Software Foundation, Inc.This file is part of GNU CC.GNU CC is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2, or (at your option)any later version.GNU CC is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with GNU CC; see the file COPYING. If not, write tothe Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "tconfig.h"#include "gstdarg.h"#include "object.h"#include "objc-proto.h"#include <errno.h>#ifndef errnoextern int errno;#endif#define CLASS(class) ((Class_t)class)@implementation Object+ new{ return class_createInstance (CLASS (self));}+ free { return nil; }- free { return object_dispose (self); }- copy { return [self shallowCopy]; }- shallowCopy{ return object_copy (self);}- deepCopy{ return class_createInstance ([self class]);}+ (Class_t)class { return CLASS (self); }+ (Class_t)superClass { return CLASS (self)->super_class; }- (Class_t)class { return isa; }- (Class_t)superClass { return isa->super_class; }- (const char *)name { return object_getClassName (self); }- self { return self; }- (unsigned int)hash{ return (unsigned int)self; /* gak! Not portable. */}- (BOOL)isEqual:anObject{ return self == anObject ;}- (BOOL)isKindOf:(Class_t)aClassObject{ Class_t class; for (class = isa; class; class = class->super_class) if (class == aClassObject) return YES; return NO;}- (BOOL)isMemberOf:(Class_t)aClassObject{ return isa == aClassObject ;}- (BOOL)isKindOfGivenName:(const char*)aClassName{ Class_t class; for (class = isa; class; class = class->super_class) if (!strcmp (class_getClassName (class), aClassName)) return YES; return NO;}- (BOOL)isMemberOfGivenName:(const char*)aClassName{ return !strcmp ([self name], aClassName);}+ (BOOL)instancesRespondTo:(SEL)aSel{ if (class_getInstanceMethod (CLASS (self), aSel)) return YES; return NO;}- (BOOL)respondsTo:(SEL)aSel{ if (class_getInstanceMethod (isa, aSel)) return YES; return NO;}- perform:(SEL)aSel{ return (*((IMP)objc_msgSend (self, aSel)))(self, aSel);}- perform:(SEL)aSel with:aObject{ return (*((IMP)objc_msgSend (self, aSel)))(self, aSel, aObject);}+ poseAs:(Class_t)aClassObject{ return class_poseAs (self, aClassObject);} - subclassResponsibility:(SEL)aSel{ return [self error:"subclass should override %s", aSel];}- notImplemented:(SEL)aSel{ return [self error:"method %s not implemented", aSel];}- doesNotRecognize:(SEL)aSel{ return [self error:"%s does not recognize %s", [self name], aSel];}- error:(const char*)aString, ...{#define FMT "error: %s (instance)\n%s\n" char fmt[strlen (FMT) + strlen (isa->name) + strlen (aString) + 8]; va_list ap; sprintf (fmt, FMT, isa->name, aString); va_start (ap, aString); (*_error)(self, fmt, ap); va_end (ap);#undef FMT return self;}+ error:(const char*)aString, ...{#define FMT "error: %s (class)\n%s\n" char fmt[strlen (FMT) + strlen (isa->name) + strlen (aString) + 8]; va_list ap; sprintf (fmt, FMT, isa->name, aString); va_start (ap, aString); (*_error)(self, fmt, ap); va_end (ap);#undef FMT return self;}- storeOn:(int)aFd{ int len; long version = [[self class] version]; if ((len = write (aFd, "#", strlen ("#"))) != -1) if ((len = write (aFd, [self name], strlen ([self name]) + 1)) != -1) len = write (aFd, &version, sizeof (version)); if (len == -1) [self error:"error passivating object, errno=%d", errno]; return self;}+ readFrom:(int)aFd{ id aObj = nil; char objName[256]; int len; if ((len = read (aFd, &objName, strlen ("#"))) != -1) if (objName[0] == '#') { long version; int i = 0; /* Read the object's class. */ do { len = read (aFd, &objName[i], sizeof (char)); } while (objName[i++] && (len != -1)); /* Get its version. */ if (len != -1) len = read (aFd, &version, sizeof (version)); /* No errors??? Then create a object. */ if (len != -1) { aObj = class_createInstance (objc_getClass (objName)); /* If the object was successfully created then tell it to dearchive itself. */ if (aObj) [aObj readFrom:aFd]; } } if (len == -1) [self error:"error activating object, errno=%d", errno]; return aObj;}- readFrom:(int)aFd { return self; }+ (int)version{ return class_getVersion (CLASS (self));}+ setVersion:(int)aVersion{ class_setVersion (CLASS (self), aVersion); return self;}@end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -