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? 他们为什么不继承?
有一种可能是跨平台的需要。