NSObject

Posted CH520 -- Cnblogs。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NSObject相关的知识,希望对你有一定的参考价值。

1、@protocol NSObject

  • 1.1 功能说明

    • @protocol NSObject 是 Objective-C 中的一个协议(protocol),它定义了一个对象应该实现的基本方法。
    • 这个协议中定义的方法是最基本的方法,包括对象的初始化、内存管理、类信息等基础功能。
    • 所有的 Objective-C 对象都会默认实现这个协议,因此任何一个 NSObject 子类都会有这些方法的默认实现,而在这个基础上子类可以增加自己的方法和属性。
    • 在 Objective-C 中,协议是一种重要的特性,可以让对象在保持独立性的同时,也能够与其他对象进行交互和通信。
  • 1.2 属性、方法说明

/** 对象的父类类型 */
@property (readonly) Class superclass;
/** 对象的描述信息 */
@property (readonly, copy) NSString *description;
/** 对象的调试描述信息 */
@property (readonly, copy) NSString *debugDescription;

/**
 * @brief 返回对象的类型
 *
 * @return Class类型,对象的类型
 */
- (Class)class OBJC_SWIFT_UNAVAILABLE("use \'type(of: anObject)\' instead");

/**
 * @brief 返回当前对象
 *
 * @return 当前对象
 */
- (instancetype)self;

/** 对象的哈希值 */
@property (readonly) NSUInteger hash;

/**
 * @brief 判断两个对象是否相等
 *
 * @param object  要比较的另一个对象
 *
 * @return BOOL类型,如果两个对象相等则为YES,反之则为NO
 */
- (BOOL)isEqual:(id)object;

/**
 * @brief 执行指定的方法
 *
 * @param aSelector  要执行方法的选择器
 *
 * @return 方法执行后的返回值
 */
- (id)performSelector:(SEL)aSelector;

/**
 * @brief 执行带一个参数的指定的方法
 *
 * @param aSelector  要执行方法的选择器
 * @param object     方法参数
 *
 * @return 方法执行后的返回值
 */
- (id)performSelector:(SEL)aSelector withObject:(id)object;

/**
 * @brief 执行带两个参数的指定的方法
 *
 * @param aSelector   要执行方法的选择器
 * @param object1     方法第一个参数
 * @param object2     方法第二个参数
 *
 * @return 方法执行后的返回值
 */
- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;

/**
 * @brief 判断对象是否是一个代理对象
 *
 * @return BOOL类型,如果是代理对象则为YES,反之则为NO
 */
- (BOOL)isProxy;

/**
 * @brief 判断对象是否是指定类或其子类的实例
 *
 * @param aClass  要比较的类
 *
 * @return BOOL类型,如果对象是指定类或其子类的实例则为YES,反之则为NO
 */
- (BOOL)isKindOfClass:(Class)aClass;

/**
 * @brief 判断对象是否是指定类的实例
 *
 * @param aClass  要比较的类
 *
 * @return BOOL类型,如果对象是指定类的实例则为YES,反之则为NO
 */
- (BOOL)isMemberOfClass:(Class)aClass;

/**
 * @brief 判断对象是否遵循了指定协议
 *
 * @param aProtocol  要比较的协议
 *
 * @return BOOL类型,如果对象遵循了指定协议则为YES,反之则为NO
 */
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;

/**
 * @brief 判断对象是否实现了指定的方法
 *
 * @param aSelector  要判断的方法的选择器
 *
 * @return BOOL类型,如果对象实现了指定的方法则为YES,反之则为NO
 */
- (BOOL)respondsToSelector:(SEL)aSelector;

/**
 * @brief 返回对象的当前的引用计数
 *
 * @return NSUInteger类型,对象的当前的引用计数
 */
- (NSUInteger)retainCount OBJC_ARC_UNAVAILABLE;

/**
 * @brief 引用计数加1,ARC模式下不可用
 *
 * @return 当前对象
 */
- (instancetype)retain OBJC_ARC_UNAVAILABLE;

/**
 * @brief 引用计数减1,ARC模式下不可用
 */
- (oneway void)release OBJC_ARC_UNAVAILABLE;

/**
 * @brief 对象被标记为不需要在动态内存管理的下释放,ARC模式下不可用
 *
 * @return 当前对象
 */
- (instancetype)autorelease OBJC_ARC_UNAVAILABLE;

/**
 * @brief 返回指向对象所在的内存区域的指针,ARC模式下不可用
 *
 * @return 指向对象所在的内存区域的指针
 */
- (struct _NSZone *)zone OBJC_ARC_UNAVAILABLE;

2、@interface NSObject

  • 2.1 功能说明

    • 这是一个 Objective-C 的关键字,表示定义了一个类,且该类继承了 NSObject。
    • NSObject 是一个 Objective-C 面向对象编程中的基类,定义了一些基本的方法和属性,如内存管理、对象的初始化等。
    • 同时,指定 表示该类遵循 NSObject 协议,以确保实现了一些必要的方法来符合 Objective-C 中的内存管理模式。
  • 2.2 属性、方法说明

/**
 * @brief 在应用程序第一次加载类时调用,只会调用一次
 */
+ (void)load;

/**
 * @brief 在类或其子类的第一个方法调用之前调用,并且只会调用一次
 */
+ (void)initialize;

/**
 * @brief 初始化方法,返回一个新分配的类实例
 *
 * @discussion 一般情况下不应该直接调用init方法,而是使用类提供的便利构造方法来初始化对象
 */
- (instancetype)init;

/**
 * @brief 分配并返回一个类的新实例,但没有初始化该实例
 *
 * @return 返回一个新实例
 */
+ (instancetype)new OBJC_SWIFT_UNAVAILABLE("use object initializers instead");

/**
 * @brief 分配并返回一个类的新实例,但没有初始化该实例
 *
 * @param zone 分配内存所在的区域
 * @return 返回一个新实例
 */
+ (instancetype)allocWithZone:(struct _NSZone *)zone OBJC_SWIFT_UNAVAILABLE("use object initializers instead");

/**
 * @brief 分配并返回一个类的新实例,但没有初始化该实例
 *
 * @return 返回一个新实例
 */
+ (instancetype)alloc OBJC_SWIFT_UNAVAILABLE("use object initializers instead");

/**
 * @brief 析构方法
 */
- (void)dealloc OBJC_SWIFT_UNAVAILABLE("use \'deinit\' to define a de-initializer");

/**
 * @brief 返回一个对象的浅副本
 *
 * @return 返回一个浅副本
 */
- (id)copy;

/**
 * @brief 返回一个对象的深副本
 *
 * @return 返回一个深副本
 */
- (id)mutableCopy;

/**
 * @brief 根据给定的内存区域复制一个对象
 *
 * @param zone 分配内存所在的区域
 * @return 返回一个分配好后的对象
 */
+ (id)copyWithZone:(struct _NSZone *)zone OBJC_ARC_UNAVAILABLE;

/**
 * @brief 根据给定的内存区域复制一个对象
 *
 * @param zone 分配内存所在的区域
 * @return 返回一个分配好后的对象
 */
+ (id)mutableCopyWithZone:(struct _NSZone *)zone OBJC_ARC_UNAVAILABLE;

/**
 * @brief 判断该类是否有实现指定的方法
 *
 * @param aSelector 要判断的方法的选择器
 * @return 有返回YES,没有返回NO
 */
+ (BOOL)instancesRespondToSelector:(SEL)aSelector;

/**
 * @brief 判断该类是否符合指定协议
 *
 * @param protocol 要判断的协议
 * @return 符合返回YES,不符合返回NO
 */
+ (BOOL)conformsToProtocol:(Protocol *)protocol;

/**
 * @brief 返回类实现指定方法的函数指针
 *
 * @param aSelector 要获取的方法的选择器
 * @return 类实现指定方法的函数指针
 */
- (IMP)methodForSelector:(SEL)aSelector;

/**
 * @brief 返回类或其父类的实现指定方法的函数指针
 *
 * @param aSelector 要获取的方法的选择器
 * @return 类或其父类实现指定方法的函数指针
 */
+ (IMP)instanceMethodForSelector:(SEL)aSelector;

/**
 * @brief 如果对象无法响应传入的消息,则调用此方法
 *
 * @param aSelector 无法响应的消息的选择器
 */
- (void)doesNotRecognizeSelector:(SEL)aSelector;

/**
 * @brief 返回一个对象,该对象将接收并处理无法响应的消息
 *
 * @param aSelector 无法响应的消息的选择器
 * @return 返回一个对象,该对象将接收并处理无法响应的消息
 */
- (id)forwardingTargetForSelector:(SEL)aSelector OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);

/**
 * @brief 将无法识别的消息转发到另一个接收器进行处理
 *
 * @param anInvocation 无法识别的消息
 */
- (void)forwardInvocation:(NSInvocation *)anInvocation OBJC_SWIFT_UNAVAILABLE("");

/**
 * @brief 返回一个方法的方法签名
 *
 * @param aSelector 需要获取方法签名的方法
 * @return 返回方法签名
 */
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector OBJC_SWIFT_UNAVAILABLE("");

/**
 * @brief 返回一个方法的方法签名
 *
 * @param aSelector 需要获取方法签名的方法
 * @return 返回方法签名
 */
+ (NSMethodSignature *)instanceMethodSignatureForSelector:(SEL)aSelector OBJC_SWIFT_UNAVAILABLE("");

/**
 * @brief 允许该对象被弱参考,但是已被弃用
 *
 * @return 返回YES或NO
 */
- (BOOL)allowsWeakReference UNAVAILABLE_ATTRIBUTE;

/**
 * @brief 声明该对象不支持被弱参考,但是已被弃用
 *
 * @return 返回YES或NO
 */
- (BOOL)retainWeakReference UNAVAILABLE_ATTRIBUTE;

/**
 * @brief 判断该类是否为另一个类的子类
 *
 * @param aClass 要判断的类
 * @return 如果是返回YES,不是返回NO
 */
+ (BOOL)isSubclassOfClass:(Class)aClass;

/**
 * @brief 动态添加一个类方法
 *
 * @param sel 要添加的类方法的选择器
 * @return 如果添加成功返回YES,否则返回NO
 */
+ (BOOL)resolveClassMethod:(SEL)sel OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);

/**
 * @brief 动态添加一个实例方法
 *
 * @param sel 要添加的实例方法的选择器
 * @return 如果添加成功返回YES,否则返回NO
 */
+ (BOOL)resolveInstanceMethod:(SEL)sel OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);

/**
 * @brief 返回一个整数值,该值用于标识类的实例
 *
 * @return 返回一个整数值,该值用于标识类的实例
 */
+ (NSUInteger)hash;

/**
 * @brief 返回这个类的超类,如果该类没有超类,则返回nil
 *
 * @return 返回这个类的超类,如果该类没有超类,则返回nil
 */
+ (Class)superclass;

/**
 * @brief 返回对象的类
 *
 * @return 返回对象的类
 */
+ (Class)class OBJC_SWIFT_UNAVAILABLE("use \'aClass.self\' instead");

/**
 * @brief 返回一个字符串,该字符串描述了对象实例
 *
 * @return 返回一个字符串,该字符串描述了对象实例
 */
+ (NSString *)description;

/**
 * @brief 返回一个字符串,该字符串描述了对象实例信息的详细信息
 *
 * @return 返回一个字符串,该字符串描述了对象实例信息的详细信息
 */
+ (NSString *)debugDescription;

以上是关于NSObject的主要内容,如果未能解决你的问题,请参考以下文章

id, NSObject *, id<NSObject>区别

IOS学习基础NSObject.h学习

NSObject头文件解析 / 消息机制 / Runtime解读

从 NSObject 类更新 UITabBarController 栏项目

ios开发之 NSObject详解

从 NSObject 类创建一个数组