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协议里的方法都可以根据自己的需求自定义。

posted @ 2017-05-08 14:01  豆丶浆油条  阅读(965)  评论(0编辑  收藏  举报