iOSSharing #10 | 2019-05-27

目錄

1. Category、 Extension和繼承的區別?

2. isKindOfClass、isMemberOfClass做用分別是什麼?

3. 開發中逆向傳值的方式有哪些?

4. 開發中方法延遲執行的方式有哪些?

5. +load 和 +initialize 的區別是什麼?

1. Category、 Extension和繼承的區別?

  • Category有名字,Extension沒有名字,是一種特殊的Category
  • Category只能擴展方法(屬性僅僅是聲明,並沒真正實現),Extension能夠擴展屬性、成員變量和方法。
  • 繼承能夠增長,修改或者刪除方法,而且能夠增長屬性。

2. isKindOfClass、isMemberOfClass做用分別是什麼?

  • isKindOfClass:做用是某個對象屬於某個類型或者繼承自某類型。
  • isMemberOfClass:某個對象確切屬於某個類型。
//Dog繼承自Animal
Animal *a = [Animal new];
Dog *d = [Dog new];
        
NSLog(@"%d",[a isKindOfClass:[Animal class]]);    //1
NSLog(@"%d",[a isMemberOfClass:[Animal class]]);  //1
        
NSLog(@"%d",[d isKindOfClass:[Animal class]]);    //1
NSLog(@"%d",[d isMemberOfClass:[Animal class]]);  //0

NSLog(@"%d",[d isKindOfClass:[Dog class]]);       //1
NSLog(@"%d",[d isMemberOfClass:[Dog class]]);     //1
複製代碼

Warning: 不要對NSArray、NSString等Apple實現的類進行isMemberOfClass操做,得出的結果是falseui

NSString *s = @"";
NSLog(@"%d",[s isMemberOfClass:[NSString class]]);  //0
複製代碼

Apple使用類簇的方式實現的這些類,因此s不是NSString類的實例。spa

3. 開發中逆向傳值的方式有哪些?

  • 代理
  • 通知
  • 單例
  • block
  • KVO

4. 開發中方法延遲執行的方式有哪些?

(1)、performSelector

此方法是一種非阻塞的執行方式,未找到取消執行的方法。線程

[self performSelector:@selector(delayMethod) withObject:nil/*可傳任意類型參數*/ afterDelay:1.0];
複製代碼

(2)、NSTimer

此方法是一種非阻塞的執行方式, 取消執行方法:- (void)invalidate;代理

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(delayMethod) userInfo:nil repeats:NO];
複製代碼

(3)、NSThread的sleep

此方法是一種阻塞執行方式,建議放在子線程中執行,不然會卡住界面。但有時仍是須要阻塞執行,如進入歡迎界面須要沉睡3秒才進入主界面時。 沒有找到取消執行方式。code

[NSThread sleepForTimeInterval:1.0];
複製代碼

(4)、GCD

此方法能夠在參數中選擇執行的線程,是一種非阻塞執行方式。沒有找到取消執行方式。orm

dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0/*延遲執行時間*/ * NSEC_PER_SEC));

dispatch_after(delayTime, dispatch_get_main_queue(), ^{
    [weakSelf delayMethod];
});`
複製代碼

5. +load 和 +initialize 的區別是什麼?

(1)、+(void)load;

+load 方法是當類或分類被添加到 Objective-C runtime 時被調用的,實現這個方法能夠讓咱們在類加載的時候執行一些類相關的行爲。子類的 +load 方法會在它的全部父類的 +load 方法以後執行,而分類的 +load 方法會在它的主類的 +load 方法以後執行。可是不一樣的類之間的 +load 方法的調用順序是不肯定的。對象

(2)、+(void)initialize;

+initialize 方法是在類或它的子類收到第一條消息以前被調用的,這裏所指的消息包括實例方法和類方法的調用。也就是說 +initialize 方法是以懶加載的方式被調用的,若是程序一直沒有給某個類或它的子類發送消息,那麼這個類的 +initialize 方法是永遠不會被調用的。繼承

相關文章
相關標籤/搜索