協議就是一組介面的集合, 遵守一個協議之後就擁有的該協議中所有方法的聲明 。NSObject這個類遵守了NSObject協議,並且實現了NSObject協議里的所有方法,所以NSObject類及其子類都可以調用這些方法。本文主要介紹NSObject協議里的方法。 (1) &e ...
協議就是一組介面的集合,遵守一個協議之後就擁有的該協議中所有方法的聲明。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協議里的方法都可以根據自己的需求自定義。