美文网首页
ObjC源码解读之一

ObjC源码解读之一

作者: LV大树 | 来源:发表于2020-11-15 01:41 被阅读0次

    本系列主要用来解读OC开放源码:objc

    NSObject的实现内容

    @implementation NSObject
    
    + (void)initialize {
    }
    
    + (id)self {
        return (id)self;
    }
    
    - (id)self {
        return self;
    }
    
    + (Class)class {
        return self;
    }
    
    - (Class)class {
        return object_getClass(self);
    }
    
    + (Class)superclass {
        return self->superclass;
    }
    
    - (Class)superclass {
        return [self class]->superclass;
    }
    
    + (BOOL)isMemberOfClass:(Class)cls {
        return self->ISA() == cls;
    }
    
    - (BOOL)isMemberOfClass:(Class)cls {
        return [self class] == cls;
    }
    
    + (BOOL)isKindOfClass:(Class)cls {
        for (Class tcls = self->ISA(); tcls; tcls = tcls->superclass) {
            if (tcls == cls) return YES;
        }
        return NO;
    }
    
    - (BOOL)isKindOfClass:(Class)cls {
        for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
            if (tcls == cls) return YES;
        }
        return NO;
    }
    
    + (BOOL)isSubclassOfClass:(Class)cls {
        for (Class tcls = self; tcls; tcls = tcls->superclass) {
            if (tcls == cls) return YES;
        }
        return NO;
    }
    
    + (BOOL)isAncestorOfObject:(NSObject *)obj {
        for (Class tcls = [obj class]; tcls; tcls = tcls->superclass) {
            if (tcls == self) return YES;
        }
        return NO;
    }
    
    + (BOOL)instancesRespondToSelector:(SEL)sel {
        return class_respondsToSelector_inst(nil, sel, self);
    }
    
    + (BOOL)respondsToSelector:(SEL)sel {
        return class_respondsToSelector_inst(self, sel, self->ISA());
    }
    
    - (BOOL)respondsToSelector:(SEL)sel {
        return class_respondsToSelector_inst(self, sel, [self class]);
    }
    
    + (BOOL)conformsToProtocol:(Protocol *)protocol {
        if (!protocol) return NO;
        for (Class tcls = self; tcls; tcls = tcls->superclass) {
            if (class_conformsToProtocol(tcls, protocol)) return YES;
        }
        return NO;
    }
    
    - (BOOL)conformsToProtocol:(Protocol *)protocol {
        if (!protocol) return NO;
        for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
            if (class_conformsToProtocol(tcls, protocol)) return YES;
        }
        return NO;
    }
    
    + (NSUInteger)hash {
        return _objc_rootHash(self);
    }
    
    - (NSUInteger)hash {
        return _objc_rootHash(self);
    }
    
    + (BOOL)isEqual:(id)obj {
        return obj == (id)self;
    }
    
    - (BOOL)isEqual:(id)obj {
        return obj == self;
    }
    
    
    + (BOOL)isFault {
        return NO;
    }
    
    - (BOOL)isFault {
        return NO;
    }
    
    + (BOOL)isProxy {
        return NO;
    }
    
    - (BOOL)isProxy {
        return NO;
    }
    
    
    + (IMP)instanceMethodForSelector:(SEL)sel {
        if (!sel) [self doesNotRecognizeSelector:sel];
        return class_getMethodImplementation(self, sel);
    }
    
    + (IMP)methodForSelector:(SEL)sel {
        if (!sel) [self doesNotRecognizeSelector:sel];
        return object_getMethodImplementation((id)self, sel);
    }
    
    - (IMP)methodForSelector:(SEL)sel {
        if (!sel) [self doesNotRecognizeSelector:sel];
        return object_getMethodImplementation(self, sel);
    }
    
    + (BOOL)resolveClassMethod:(SEL)sel {
        return NO;
    }
    
    + (BOOL)resolveInstanceMethod:(SEL)sel {
        return NO;
    }
    
    // Replaced by CF (throws an NSException)
    + (void)doesNotRecognizeSelector:(SEL)sel {
        _objc_fatal("+[%s %s]: unrecognized selector sent to instance %p", 
                    class_getName(self), sel_getName(sel), self);
    }
    
    // Replaced by CF (throws an NSException)
    - (void)doesNotRecognizeSelector:(SEL)sel {
        _objc_fatal("-[%s %s]: unrecognized selector sent to instance %p", 
                    object_getClassName(self), sel_getName(sel), self);
    }
    
    
    + (id)performSelector:(SEL)sel {
        if (!sel) [self doesNotRecognizeSelector:sel];
        return ((id(*)(id, SEL))objc_msgSend)((id)self, sel);
    }
    
    + (id)performSelector:(SEL)sel withObject:(id)obj {
        if (!sel) [self doesNotRecognizeSelector:sel];
        return ((id(*)(id, SEL, id))objc_msgSend)((id)self, sel, obj);
    }
    
    + (id)performSelector:(SEL)sel withObject:(id)obj1 withObject:(id)obj2 {
        if (!sel) [self doesNotRecognizeSelector:sel];
        return ((id(*)(id, SEL, id, id))objc_msgSend)((id)self, sel, obj1, obj2);
    }
    
    - (id)performSelector:(SEL)sel {
        if (!sel) [self doesNotRecognizeSelector:sel];
        return ((id(*)(id, SEL))objc_msgSend)(self, sel);
    }
    
    - (id)performSelector:(SEL)sel withObject:(id)obj {
        if (!sel) [self doesNotRecognizeSelector:sel];
        return ((id(*)(id, SEL, id))objc_msgSend)(self, sel, obj);
    }
    
    - (id)performSelector:(SEL)sel withObject:(id)obj1 withObject:(id)obj2 {
        if (!sel) [self doesNotRecognizeSelector:sel];
        return ((id(*)(id, SEL, id, id))objc_msgSend)(self, sel, obj1, obj2);
    }
    
    
    // Replaced by CF (returns an NSMethodSignature)
    + (NSMethodSignature *)instanceMethodSignatureForSelector:(SEL)sel {
        _objc_fatal("+[NSObject instanceMethodSignatureForSelector:] "
                    "not available without CoreFoundation");
    }
    
    // Replaced by CF (returns an NSMethodSignature)
    + (NSMethodSignature *)methodSignatureForSelector:(SEL)sel {
        _objc_fatal("+[NSObject methodSignatureForSelector:] "
                    "not available without CoreFoundation");
    }
    
    // Replaced by CF (returns an NSMethodSignature)
    - (NSMethodSignature *)methodSignatureForSelector:(SEL)sel {
        _objc_fatal("-[NSObject methodSignatureForSelector:] "
                    "not available without CoreFoundation");
    }
    
    + (void)forwardInvocation:(NSInvocation *)invocation {
        [self doesNotRecognizeSelector:(invocation ? [invocation selector] : 0)];
    }
    
    - (void)forwardInvocation:(NSInvocation *)invocation {
        [self doesNotRecognizeSelector:(invocation ? [invocation selector] : 0)];
    }
    
    + (id)forwardingTargetForSelector:(SEL)sel {
        return nil;
    }
    
    - (id)forwardingTargetForSelector:(SEL)sel {
        return nil;
    }
    
    
    // Replaced by CF (returns an NSString)
    + (NSString *)description {
        return nil;
    }
    
    // Replaced by CF (returns an NSString)
    - (NSString *)description {
        return nil;
    }
    
    + (NSString *)debugDescription {
        return [self description];
    }
    
    - (NSString *)debugDescription {
        return [self description];
    }
    
    
    + (id)new {
        return [callAlloc(self, false/*checkNil*/) init];
    }
    
    + (id)retain {
        return (id)self;
    }
    
    // Replaced by ObjectAlloc
    - (id)retain {
        return _objc_rootRetain(self);
    }
    
    
    + (BOOL)_tryRetain {
        return YES;
    }
    
    // Replaced by ObjectAlloc
    - (BOOL)_tryRetain {
        return _objc_rootTryRetain(self);
    }
    
    + (BOOL)_isDeallocating {
        return NO;
    }
    
    - (BOOL)_isDeallocating {
        return _objc_rootIsDeallocating(self);
    }
    
    + (BOOL)allowsWeakReference { 
        return YES; 
    }
    
    + (BOOL)retainWeakReference {
        return YES; 
    }
    
    - (BOOL)allowsWeakReference { 
        return ! [self _isDeallocating]; 
    }
    
    - (BOOL)retainWeakReference { 
        return [self _tryRetain]; 
    }
    
    + (oneway void)release {
    }
    
    // Replaced by ObjectAlloc
    - (oneway void)release {
        _objc_rootRelease(self);
    }
    
    + (id)autorelease {
        return (id)self;
    }
    
    // Replaced by ObjectAlloc
    - (id)autorelease {
        return _objc_rootAutorelease(self);
    }
    
    + (NSUInteger)retainCount {
        return ULONG_MAX;
    }
    
    - (NSUInteger)retainCount {
        return _objc_rootRetainCount(self);
    }
    
    + (id)alloc {
        return _objc_rootAlloc(self);
    }
    
    // Replaced by ObjectAlloc
    + (id)allocWithZone:(struct _NSZone *)zone {
        return _objc_rootAllocWithZone(self, (malloc_zone_t *)zone);
    }
    
    // Replaced by CF (throws an NSException)
    + (id)init {
        return (id)self;
    }
    
    - (id)init {
        return _objc_rootInit(self);
    }
    
    // Replaced by CF (throws an NSException)
    + (void)dealloc {
    }
    
    
    // Replaced by NSZombies
    - (void)dealloc {
        _objc_rootDealloc(self);
    }
    
    // Previously used by GC. Now a placeholder for binary compatibility.
    - (void) finalize {
    }
    
    + (struct _NSZone *)zone {
        return (struct _NSZone *)_objc_rootZone(self);
    }
    
    - (struct _NSZone *)zone {
        return (struct _NSZone *)_objc_rootZone(self);
    }
    
    + (id)copy {
        return (id)self;
    }
    
    + (id)copyWithZone:(struct _NSZone *)zone {
        return (id)self;
    }
    
    - (id)copy {
        return [(id)self copyWithZone:nil];
    }
    
    + (id)mutableCopy {
        return (id)self;
    }
    
    + (id)mutableCopyWithZone:(struct _NSZone *)zone {
        return (id)self;
    }
    
    - (id)mutableCopy {
        return [(id)self mutableCopyWithZone:nil];
    }
    
    @end
    
    

    C++里定义的锁的枚举

    //锁的总类
    enum class lockkind {
        MUTEX = 1, MONITOR = 2, RDLOCK = 3, WRLOCK = 4, RECURSIVE = 5
    };
    

    下面是宏定义

    #define MUTEX     lockkind::MUTEX //互斥
    #define MONITOR   lockkind::MONITOR //观察
    #define RDLOCK    lockkind::RDLOCK //read
    #define WRLOCK    lockkind::WRLOCK   //write
    #define RECURSIVE lockkind::RECURSIVE//递归
    

    'strncmp'
    strncmp函数为字符串比较函数,字符串大小的比较是以ASCII 码表上的顺序来决定,此顺序亦为字符的值。其函数声明为int strncmp ( const char * str1, const char * str2, size_t n );功能是把 str1 和 str2 进行比较,最多比较前 n 个字节,若str1与str2的前n个字符相同,则返回0;若s1大于s2,则返回大于0的值;若s1 小于s2,则返回小于0的值。


    strchr函数功能为在一个串中查找给定字符的第一个匹配之处。函数原型为:char *strchr(const char *str, int c),即在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。

    相关文章

      网友评论

          本文标题:ObjC源码解读之一

          本文链接:https://www.haomeiwen.com/subject/gvrmbktx.html