【iOSSharing #10】2019-05-27

526 阅读3分钟

iOS Sharing 系列

目录

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操作,得出的结果是false

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

Apple使用类簇的方式实现的这些类,所以s不是NSString类的实例。

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秒才进入主界面时。 没有找到取消执行方式。

[NSThread sleepForTimeInterval:1.0];

(4)、GCD

此方法可以在参数中选择执行的线程,是一种非阻塞执行方式。没有找到取消执行方式。

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 方法是永远不会被调用的。