美文网首页
iOS 详解NSObject协议

iOS 详解NSObject协议

作者: 豆丶浆油条 | 来源:发表于2017-05-05 18:48 被阅读176次

协议就是一组接口的集合,遵守一个协议之后就拥有的该协议中所有方法的声明。NSObject这个类遵守了NSObject协议,并且实现了NSObject协议里的所有方法,所以NSObject类及其子类都可以调用这些方法。本文主要介绍NSObject协议里的方法。

- (BOOL)isEqual:(id)object;

"=="判断是否是同一个对象,比较的是内存地址。"isEqual"判断两个对像是否相同,比较的是成员变量的值是否相同。

@interface Person : NSObject

@property (nonatomic, strong) NSString *father;
@property (nonatomic, assign) NSUInteger age;

@end

@implementation Person

@end
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
  
    [super viewDidLoad];
    
    Person *xiaoming = [Person new];
    xiaoming.father = @"laowang";
    xiaoming.age = 12;
    
    Person *xiaohong = [Person new];
    xiaohong.father = @"laowang";
    xiaohong.age = 12;
    
    NSLog(@"xiaoming == xiaohong = %d",xiaoming == xiaohong);
    NSLog(@"xiaohong isEqual:xiaohong = %d",[xiaohong isEqual:xiaohong]);
}
2017-05-06 09:26:51.799 OCTest[2401:832010] xiaoming == xiaohong = 0
2017-05-06 09:26:51.799 OCTest[2401:832010] xiaohong isEqual:xiaohong = 1
@property (readonly) NSUInteger hash;

Hash Table的key,用于set和dictionary,默认是对象在内存中的地址,保证了唯一性。

- (void)viewDidLoad {
  
    [super viewDidLoad];
    
    NSLog(@"self = %ld",self);
    NSLog(@"self.hash = %u",self.hash);
}
2017-05-06 09:32:01.116 OCTest[2408:832939] self = 384375648
2017-05-06 09:32:01.117 OCTest[2408:832939] self.hash = 384375648
@property (readonly) Class superclass;

对象的父类, NSObject实例的superclass为NULL。

- (Class)class;

获得对象的类。‘+(Class)class;’获得的是类对象的元类;

- (instancetype)self;

获得对象自己。

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

是对象调用某个方法,object是参数,最多有两个。

- (BOOL)isProxy;

是否是NSProxy的实例;NSObject是大多数类的基类,例外一部分就是NSProxy的实例了。NSProxy是一个非常神奇的类,可以用来模仿多继承,因为他可以转发消息,指定一个实例执行消息。

- (BOOL)isKindOfClass:(Class)aClass;

判断某个对象是否是某个类或者子类的实例。

- (BOOL)isMemberOfClass:(Class)aClass;

判断某个对象是否是某个类的实例.

- (BOOL)conformsToProtocol:(Protocol *)aProtocol;

判断某个实例是否遵守协议,是否实现了协议里的方法不一定。这个方法只能判断是否声明了协议了里的方法,是否实现得用"respondsToSelector"判断。

- (BOOL)respondsToSelector:(SEL)aSelector;

是否响应了某个方法。代理传值之前,必须判断是否是响应了协议里的方法,否则会崩溃。
  除了NSObject协议,其他所有的协议都必须得遵守NSObject协议。这是为什么呢?如果不遵守会怎样?我可以明确的告诉你,会崩溃,会报"unrecognized selector sent to instance 0x15d78700"错误。因为代理调用了NSObject协议里的方法。声明代理的时候是id类型的,不确定是NSObject的实例,所以不能调用NSObject协议里的方法。

@protocol PersonDelegate <NSObject>
@end
- (instancetype)retain;
- (oneway void)release;
- (instancetype)autorelease;
- (NSUInteger)retainCount;
- (struct _NSZone *)zone ;

现在都是ARC了,还调用MRC才能使用的方法,真是太落伍了。

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

description是代码打印输出实例的时候调用的方法,debugDescription是控制台也就是po的时候输出实例的时候调用的方法,都可以自定义。其实NSObject协议里的方法都可以根据自己的需求自定义。

相关文章

  • iOS 详解NSObject协议

    协议就是一组接口的集合,遵守一个协议之后就拥有的该协议中所有方法的声明。NSObject这个类遵守了NSObjec...

  • NSObject.h

    版本:iOS13.5 NSObject.h runtime其他方法通道 NSObject的协议 NSObject的...

  • NSHTTPCookieStorage(Objective-C)

    继承自:NSObject遵守协议:NSObject导入声明:@import Foundation;适用范围:iOS...

  • NSHTTPCookie(Objective-C)官方文档翻译

    继承自:NSObject遵守协议:NSObject导入声明:@import Foundation;适用范围:iOS...

  • iOS ~ NSObject协议

    本文源自本人的学习记录整理与理解,其中参考阅读了部分优秀的博客和书籍,尽量以通俗简单的语句转述。引用到的地方如有遗...

  • iOS·NSObject的两种含义:类与协议

    1. 区分:类的NSObject与协议的NSObject iOS开发中,苹果提供的一些系统类都属于NSObject...

  • iOS NSObject详解

    前言 官方对于NSObject的解释如下:The root class of most Objective-C c...

  • 2021-08-25

    iOS swift SDK详解之NSCoding协议 详解:NSCoding是对iOS中的Model类进行编码和解...

  • iOS中的非正式协议是什么?

    简介: 在IOS2之前是没有引入@protocol协议的,IOS2之前实现协议主要是通过给NSObject添加Ca...

  • NSObject协议及本身详解

     NSObject作为一个基类,这个类遵守了NSObject协议,并且实现了NSObject协议里的所有方法,所以...

网友评论

      本文标题:iOS 详解NSObject协议

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