NSObject

NSObject


一、关于 NSObject

NSObject 类位于 /usr/include/objc/NSObject.h 中。

观看头文件可知,NSObject 这个名字,即是一个类(称为 根类),也是一个协议(称为 根协议)。

@interface NSObject <NSObject> {
  
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-interface-ivars"
    Class isa  OBJC_ISA_AVAILABILITY;
#pragma clang diagnostic pop

}

二、NSObject 属性和方法

1、初始化

+ (void)load;

+ (void)initialize;
- (instancetype)init
#if NS_ENFORCE_NSOBJECT_DESIGNATED_INITIALIZER
    NS_DESIGNATED_INITIALIZER
#endif
    ;

过期,不可用的方法

+ (instancetype)new OBJC_SWIFT_UNAVAILABLE("use object initializers instead");
+ (instancetype)allocWithZone:(struct _NSZone *)zone OBJC_SWIFT_UNAVAILABLE("use object initializers instead");
+ (instancetype)alloc OBJC_SWIFT_UNAVAILABLE("use object initializers instead");
- (void)dealloc OBJC_SWIFT_UNAVAILABLE("use 'deinit' to define a de-initializer");

- (void)finalize OBJC_DEPRECATED("Objective-C garbage collection is no longer supported");

copy

- (id)copy;
- (id)mutableCopy;

+ (id)copyWithZone:(struct _NSZone *)zone OBJC_ARC_UNAVAILABLE;
+ (id)mutableCopyWithZone:(struct _NSZone *)zone OBJC_ARC_UNAVAILABLE;

Selector



+ (BOOL)instancesRespondToSelector:(SEL)aSelector;
+ (BOOL)conformsToProtocol:(Protocol *)protocol;
- (IMP)methodForSelector:(SEL)aSelector;
+ (IMP)instanceMethodForSelector:(SEL)aSelector;
- (void)doesNotRecognizeSelector:(SEL)aSelector;

- (id)forwardingTargetForSelector:(SEL)aSelector OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
- (void)forwardInvocation:(NSInvocation *)anInvocation OBJC_SWIFT_UNAVAILABLE("");
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector OBJC_SWIFT_UNAVAILABLE("");

+ (NSMethodSignature *)instanceMethodSignatureForSelector:(SEL)aSelector OBJC_SWIFT_UNAVAILABLE("");

- (BOOL)allowsWeakReference UNAVAILABLE_ATTRIBUTE;
- (BOOL)retainWeakReference UNAVAILABLE_ATTRIBUTE;

Class

+ (BOOL)isSubclassOfClass:(Class)aClass;

+ (BOOL)resolveClassMethod:(SEL)sel OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
+ (BOOL)resolveInstanceMethod:(SEL)sel OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);

+ (NSUInteger)hash;
+ (Class)superclass;
+ (Class)class OBJC_SWIFT_UNAVAILABLE("use 'aClass.self' instead");```

description

+ (NSString *)description;
+ (NSString *)debugDescription;


三、NSObject 协议

主要约定了下面的方法,都是可选类型。

1、识别与比较对象

- (BOOL)isEqual:(id)object; //首先判断两个对象是否类型一致,如不一致,直接返回NO,再判断具体内容是否一致
@property (readonly) NSUInteger hash;  //返回一个整数,可以用来作为哈希表结构中的表地址

- (instancetype)self; //返回当前对象

2、Class 识别类


@property (readonly) Class superclass;
- (Class)class OBJC_SWIFT_UNAVAILABLE("use 'type(of: anObject)' instead");

3、消息传递

- (id)performSelector:(SEL)aSelector;
- (id)performSelector:(SEL)aSelector withObject:(id)object;
- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;

4、代理

- (BOOL)isProxy; // 判断是否是NSProxy的实例。

5、Class, Protocol, Selector



- (BOOL)isKindOfClass:(Class)aClass;
- (BOOL)isMemberOfClass:(Class)aClass;
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;

- (BOOL)respondsToSelector:(SEL)aSelector;

使用示例

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    UIImageView * imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"loli"]];
    NSLog(@"isKindOfClass : %d", [imageView isKindOfClass:[UIView class]]);  // 1
    NSLog(@"isMemberOfClass : %d", [imageView isMemberOfClass:[UIView class]]); // 0
    NSLog(@"isMemberOfClass : %d", [imageView isMemberOfClass:[UIImageView class]]); // 1
}
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    NSLog(@"respondsToSelector : %d", [self respondsToSelector:@selector(viewWillAppear:)]);  // 1
    NSLog(@"respondsToSelector : %d", [self respondsToSelector:@selector(tableView:didSelectRowAtIndexPath:)]);// 0
}

6、内存管理方法

- (instancetype)retain OBJC_ARC_UNAVAILABLE;  // 增加对象的计数器
- (oneway void)release OBJC_ARC_UNAVAILABLE; // 减少对象的计数器
- (instancetype)autorelease OBJC_ARC_UNAVAILABLE;  // 自动减少对象的计数器,但是以推迟的方式来实现
- (NSUInteger)retainCount OBJC_ARC_UNAVAILABLE; //返回一个对象当前的计数器

- (struct _NSZone *)zone OBJC_ARC_UNAVAILABLE; // 垃圾自动回收

7、description 属性描述

@property (readonly, copy) NSString *description;
@optional
@property (readonly, copy) NSString *debugDescription;

我的疑问:

  • 为什么 NSObject 只有 isSubclassOfClass方法 和 superclass 属性,而要把 isKindOfClass 作为协议方法?
    因为有些类不继承自 NSObject,却需要实现这些方法。

  • 有哪些类,不继承自 NSObject? 他们为什么不继承?
    有一种可能是跨平台的需要。

发布了43 篇原创文章 · 获赞 8 · 访问量 4582

猜你喜欢

转载自blog.csdn.net/weixin_45390999/article/details/104488297