• iOS 详解NSObject协议


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

    - (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
    

    (2)

    @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
    

    (3)

    @property (readonly) Class superclass;
    

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

    - (Class)class;
    

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

    - (instancetype)self;
    

      获得对象自己。
    (6)

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

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

    - (BOOL)isProxy;
    

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

    - (BOOL)isKindOfClass:(Class)aClass;
    

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

    - (BOOL)isMemberOfClass:(Class)aClass;
    

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

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

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

    - (BOOL)respondsToSelector:(SEL)aSelector;
    

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

    @protocol PersonDelegate <NSObject>
    @end
    

    (12)

    - (instancetype)retain;
    - (oneway void)release;
    - (instancetype)autorelease;
    - (NSUInteger)retainCount;
    - (struct _NSZone *)zone ;
    

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

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

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

  • 相关阅读:
    C++ 打印 vector
    使用 winsock 实现简单的 Client 和 Server
    Windows 10 Clion 配置 Opencv 4.0.1
    解决编译的时候头文件找不到的问题
    linux内核打印内存函数print_hex_dump使用方法
    ubuntu180
    驱动编译相关
    Real-Time Rendering 4th Chapter 1 Introduction 简介 转载
    do_gettimeofday使用方法
    6、设备树实践操作
  • 原文地址:https://www.cnblogs.com/doujiangyoutiao/p/6824772.html
Copyright © 2020-2023  润新知